Es bastante fácil dividir un data.frame
por filas dependiendo de un factor de agrupamiento. ¿Pero cómo puedo dividir por columnas y posiblemente aplicar una función?dividir un data.frame por columnas usando una variable de agrupamiento
my.df <- data.frame(a = runif(10),
b = runif(10),
c = runif(10),
d = runif(10))
grp <- as.factor(c(1,1, 2,2))
Lo que me gustaría tener es una media de columnas por grupos.
Lo que tengo hasta ahora es deficiente.
lapply(as.list(as.numeric(levels(grp))), FUN = function(x, cn, data) {
rowMeans(data[grp %in% x])
}, cn = grp, data = my.df)
EDITAR Gracias a todos por participar. Ejecuté 10 réplicas * y mi data.frame de trabajo tiene aproximadamente 22000 filas. Estos son los resultados en segundos.
Roman: 2.19
Joris: 4.60
Joris #2: 3.79 #changed sapply to lapply as suggested by Joris in the [R chatroom][1].
Gavin: 4.70
James & EDi: > 200 # * ran only one replicate due to the large order of magnitude difference
Me pareció extraño que no haya una función de envoltura para la tarea en cuestión. Tal vez algún día podamos hacer
apply(X = my.df, MARGIN = 3, INDEX = my.groups, FUN = mean) # :)
Su trama de datos tiene 10 filas, y GRP tiene 4 valores. ¿Cómo se supone que coincidan? – hadley
@hadley: el marco de datos tiene 4 columnas, y grp tiene 4 valores, por lo que coincide con ... –
@hadley, quiero dividir por columnas, no por filas, por lo que debería coincidir con la longitud (my.df) == longitud (grp). –