Todavía puedes usar tapply
aquí:
do.call(rbind,
tapply(seq_len(ncol(dat)),a1,
function(i)rowMeans(dat[,i])))
Pregunta
Lo siento, gente, no puedo ver el bosque para los árboles. Busqué mucho pero no pude encontrar una solución. Quiero, por ejemplo, la media para cada unidad (potencialmente la rowMeans
) de un subconjunto de variables en una matriz (o potencialmente un marco de datos) en R
. Me gustaría seleccionar las columnas utilizando un vector de indexación como en tapply
, que llamé a1
en el ejemplo a continuación.
> 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 solución en este ejemplo debería verse así, pero, por supuesto, me gustaría hacerlo de una manera más completa. Estaba pensando que debería usar una función del apply
familia, pero no pude averiguar cuál.
> cbind(rowMeans(dat[, a1 == 1]), rowMeans(dat[, a1 == 2]))
[,1] [,2]
[1,] 2.000000 1.0
[2,] 1.333333 1.5
Solución
Todavía puedes usar tapply
aquí:
do.call(rbind,
tapply(seq_len(ncol(dat)),a1,
function(i)rowMeans(dat[,i])))
Otros consejos
Si usted t
Ranspose sus datos, puede usar by
:
t(do.call(rbind,by(t(dat),a1,colMeans)))
1 2
V1 2.000000 1.0
V2 1.333333 1.5
También podrías usar el aggregate
función:
t(aggregate(t(dat), list(a1), mean))