varias una tablas tabla seleccionar histogramas grafico graficas filas extraer eliminar dispersion como columnas buscarv r data-manipulation

una - tablas en r



¿Cómo ejecutar tapply() en varias columnas de marco de datos usando R? (3)

Aquí hay una manera de aplicar data.table a este problema.

library(data.table) DT <- data.table(df) DT[, lapply(.SD, sum), by=a]

Y aquí hay un enfoque dplyr

library(dplyr) df %>% group_by(a) %>% summarise_all(funs(sum))

Tengo un marco de datos como el siguiente:

a b1 b2 b3 b4 b5 b6 b7 b8 b9 D 4 6 9 5 3 9 7 9 8 F 7 3 8 1 3 1 4 4 3 R 2 5 5 1 4 2 3 1 6 D 9 2 1 4 3 3 8 2 5 D 5 4 3 1 6 4 1 8 3 R 3 7 9 1 8 5 3 4 2 D 4 1 8 2 6 3 2 7 5 F 7 1 7 2 7 1 6 2 4 D 6 3 9 3 9 9 7 1 2

La función tapply(df[,2], INDEX = df$a, sum) funciona bien para producir una tabla que sume todo en df [, 2] mediante df $ a, pero cuando intento tapply(df[,2:10], INDEX = df$a, sum) para obtener una tabla similar, excepto con una suma para cada columna (2, 3, 4, ..., 10), aparece un mensaje de error que dice:

Error en tapply (df [, 2:10], INDEX = df $ a, suma): los argumentos deben tener la misma longitud

Además, me gustaría que los nombres de las filas de la tabla sean los nombres de las columnas de df[,2:10] , de modo que la fila 1 sea b1, la fila 2 sea b2 y la fila 9 sea b9.


Esto se debe a que tapply funciona en vectores y transforma df [, 2: 10] en un vector. Además de eso, la suma le dará la suma total, no la suma por columna. Utilice aggregate() , por ejemplo:

aggregate(df[,2:10],by=list(df$a), sum)

Si desea que se devuelva una lista, puede usar by () para eso. Asegúrese de especificar colSums en lugar de la suma, como funciona en un marco de datos dividido:

by(df[,2:10],df$a,FUN=colSums)


Otra posibilidad es combinar apply y tapply .

apply(df[,-1], 2, function(x) tapply(x, df$a, sum))

Producirá la salida (que es una matriz)

b1 ... b9 D sD1 ... sD9 F sF1 ... sF9 R sR1 ... sR9

Luego puede usar as.data.frame() para obtener un marco de datos como salida.