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? P> lorsque j'essaie de les attacher, p> L'erreur que je reçois est: p> Bien que ce qui suit semble donner le résultat souhaité: p> retourne p> merci! p> p> p> p>
3 Réponses :
premier un peu de notation r. Si vous regardez le code pour ... une matrice 3 x 2. < / p> p> sapply code>, vous trouverez la réponse à votre question. La fonction
sapply code> 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 () code>. Étant donné que
tableau code> (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 code> qui retournera les valeurs transposées:
Techniquement, out code> n'est pas une matrice. C'est une liste avec
Dim code> et
DimNames code> attributs. Par exemple.
Out% *% T (OUT) CODE> échoue.
Sauf le pense que c'est une matrice:> is.matrix (out) [1] vrai
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
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 })
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 code> pour être égal à
A code>.
@hadley: Merci pour le conseil, je garderai ça à l'esprit.