suma - Agrupe por varias columnas y sume otras columnas mĂșltiples
suma condicional en r (6)
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 suma de las columnas especificadas en dataColumns.
Tengo un marco de datos con aproximadamente 200 columnas, de ellas quiero agrupar la tabla por las primeras 10 o más, que son factores y sumar el resto 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 marco de datos 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
).
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
)
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
.
Usando plyr :: ddply:
library(plyr)
ddply(dtfr, .(name1, name2, namex), numcolwise(sum))
La forma simple y correcta con data.table
donde puede seleccionar y anular la selección de las columnas que desee para agrupar y sumar 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] ) ]