Agrupe por varias columnas y sume otras columnas múltiples

Tengo un dataframe con aproximadamente 200 columnas, de ellas quiero agrupar la tabla por las primeras 10 o más, que son factores y sumr el rest de las columnas.

Tengo una lista de todos los nombres de columna que quiero agrupar y la lista de todos los cols que quiero agregar.

El formato de salida que estoy buscando debe ser el mismo dataframe con el mismo número de columnas, simplemente agrupadas.

¿Hay alguna solución usando los paquetes data.table , plyr o cualquier otro?

La manera data.table es:

 DT[, lapply(.SD,sum), by=list(col1,col2,col3,...)] 

o

 DT[, lapply(.SD,sum), by=colnames(DT)[1:10]] 

donde .SD es el (S) ubset de (D) ata excluyendo columnas de grupo. (Aparte: si necesita referirse a columnas de grupo genéricamente, están en .BY ).

Esto parece una tarea para ddply (yo uso el conjunto de datos ‘baseball’ que se incluye con plyr):

 library(plyr) groupColumns = c("year","team") dataColumns = c("hr", "rbi","sb") res = ddply(baseball, groupColumns, function(x) colSums(x[dataColumns])) head(res) 

Esto le otorga a groupColumns la sum de las columnas especificadas en dataColumns.

En la base R esto sería …

 aggregate( as.matrix(df[,11:200]), as.list(df[,1:10]), FUN = sum) 

EDITAR : La función de agregado ha recorrido un largo camino desde que escribí esto. Ninguno de los castings anteriores es necesario.

 aggregate( df[,11:200], df[,1:10], FUN = sum ) 

Y hay una variedad de formas de escribir esto. Suponiendo que las primeras 10 columnas se denominan a1 a a10 me gusta lo siguiente, aunque es detallado.

 aggregate(. ~ a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10, data = dat, FUN = sum) 

(Puede usar pegar para construir la fórmula y usar la formula )

Usando plyr :: ddply:

 library(plyr) ddply(dtfr, .(name1, name2, namex), numcolwise(sum)) 

La forma dplyr sería:

 library(dplyr) df %>% group_by(col1, col2, col3) %>% summarise_each(funs(sum)) 

También puede especificar las columnas que se resumirán o excluirán de summarise_each utilizando las funciones especiales mencionadas en el archivo de ayuda de ?dplyr::select .

Otra forma de hacer esto con dplyr que sería genérico (no necesita una lista de columnas) sería:

 df %>% group_by_if(is.factor) %>% summarize_if(is.numeric,sum,na.rm = TRUE) 

La forma simple y correcta con data.table donde puede seleccionar y anular la selección de las columnas que desee para agrupar y sumr es:

DT[, lapply(.SD,sum), by= eval( colnames( DT[,c(1,2,3:10),with=F][,-c(7,8),with=F] ) ) , .SDcols=colnames( DT[,c(100:200),with=F][,-c(10:20),with=F] ) ]

    Intereting Posts