9
votes

Pourquoi sappry renvoie-t-il une matrice que je dois transposer, puis la matrice transposée ne s'attachera pas à un Dataframe?

J'apprécierais comprendre pourquoi cela se produit et comment je pourrais le faire plus éloquemment.

Lorsque j'utilise SAPPLY, j'aimerais qu'il renvoie une matrice 3x2, mais elle renvoie une matrice 2x3. Pourquoi est-ce? Et pourquoi est-il difficile d'attacher cela à un autre cadre de données? xxx

lorsque j'essaie de les attacher, xxx

L'erreur que je reçois est: xxx

Bien que ce qui suit semble donner le résultat souhaité: xxx p> je ne peux pas Utilisez sur les variables: xxx

retourne xxx

merci!


4 commentaires

Qu'essayez-vous de faire avec ces données? Votre exemple ne fait rien vraiment significatif.


@hadley: L'exemple suit les lignes directrices sur l'affichage de la fourniture d'un exemple minimal et exécutif. Le cas actuel est plutôt complexe et la complexité nuirait à la question centrale. La fonction que j'ai estimée la sensibilité d'un modèle à 20 paramètres différents à l'aide d'une expansion de la série Taylor et accepte une entrée de données 20x8 en entrée. Je serais heureux d'envoyer un exemple de reproductible complet si vous le souhaitez, bien que ce ne soit pas encore prêt à être rendu public.


Vous devez rechercher un moyen heureux entre quelque chose qui est facile à comprendre et quelque chose qui capture l'essence du problème que vous pratiquez. Dans votre exemple actuel, il semble que vous essayiez d'obtenir B pour être égal à A .


@hadley: Merci pour le conseil, je garderai ça à l'esprit.


3 Réponses :


3
votes

premier un peu de notation r. Si vous regardez le code pour sapply , vous trouverez la réponse à votre question. La fonction sapply vérifie pour voir si les longueurs de la liste sont toutes égales, et le cas échéant, il est d'abord "ecris ()" s et prend ensuite cette série de listes comme argument de données sur Array () . Étant donné que tableau (comme Matrix ()) par défaut arrange ses valeurs dans la commande de colonne, c'est ce que vous obtenez. Les listes sont tournées de leur côté. Si vous ne l'aimez pas, vous pouvez définir une nouvelle fonction tsapply qui retournera les valeurs transposées: xxx

... une matrice 3 x 2. < / p>


2 commentaires

Techniquement, out n'est pas une matrice. C'est une liste avec Dim et DimNames attributs. Par exemple. Out% *% T (OUT) échoue.


Sauf le pense que c'est une matrice:> is.matrix (out) [1] vrai



6
votes

Pour développer la réponse de Dwin: il vous aiderait à examiner la structure de votre objet code> out>. Ça explique pourquoi b $ var1 / b $ var2 code> ne fait pas ce que vous attendez.

> out <- lapply(a$id, function(x) a[x, c('var1', 'var2')])  # list of data.frames
> out <- do.call(rbind, out) # data.frame
> b <- cbind(b,out)
> str(b)
'data.frame':   3 obs. of  4 variables:
 $ var3: num  0 0 0
 $ var1: num  1 2 3
 $ var2: num  3 2 1
 $ var3: num  0 0 0
> b$var1/b$var2
[1] 0.3333333 1.0000000 3.0000000


0 commentaires

1
votes

Regardez à DDPLY du package Plyr

a <- data.frame(id=c('a','b','c'), var1 = c(1,2,3), var2 = c(3,2,1))

library(plyr)
ddply(a, "id", function(x){
    out <- cbind(O1 = rnorm(nrow(x), x$var1), O2 = runif(nrow(x)))
    out
})


0 commentaires