Vous pouvez toujours utiliser tapply
ici:
do.call(rbind,
tapply(seq_len(ncol(dat)),a1,
function(i)rowMeans(dat[,i])))
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
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 t
Rantez 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))