Question

Désolé, les gens, je ne vois pas la forêt pour les arbres. J'ai beaucoup cherché mais je n'ai pas pu trouver de solution. Je veux, par exemple, la moyenne pour chaque unité (potentiellement le rowMeans) d'un sous-ensemble de variables dans une matrice (ou potentiellement un dataframe) R. Je voudrais sélectionner les colonnes à l'aide d'un vecteur d'indexation comme dans tapply, que j'ai appelé a1 dans l'exemple ci-dessous.

> set.seed(23958)
> (dat <- matrix(sample(0:3, 10, replace = TRUE), ncol = 5))
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    3    0    2    1
[2,]    2    1    1    2    1

> set.seed(6112)
> (a1 <- sample(1:2, 5, replace = TRUE))
[1] 1 1 2 2 1

La solution de cet exemple devrait ressembler à ceci, mais bien sûr, je voudrais le faire de manière plus complète. Je pensais que je devrais utiliser une fonction du apply Famille, mais je n'ai pas pu découvrir lequel.

> cbind(rowMeans(dat[, a1 == 1]), rowMeans(dat[, a1 == 2]))
         [,1] [,2]
[1,] 2.000000  1.0
[2,] 1.333333  1.5
Était-ce utile?

La solution

Vous pouvez toujours utiliser tapply ici:

do.call(rbind,
          tapply(seq_len(ncol(dat)),a1,
           function(i)rowMeans(dat[,i])))

Autres conseils

Si vous tRantez vos données, vous pouvez utiliser by:

t(do.call(rbind,by(t(dat),a1,colMeans)))
          1   2
V1 2.000000 1.0
V2 1.333333 1.5

Vous pouvez également utiliser le aggregate fonction:

t(aggregate(t(dat), list(a1), mean))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top