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
¿Fue útil?

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 tRanspose 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))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top