Raggruppa per colonne multiple e sum altre colonne multiple

Ho un frame di dati con circa 200 colonne, di cui voglio raggruppare la tabella per primi 10 o giù di lì che sono fattori e sumno il resto delle colonne.

Ho una lista di tutti i nomi delle colonne che voglio raggruppare e l’elenco di tutti i colle che voglio aggregare.

Il formato di output che sto cercando deve essere lo stesso dataframe con lo stesso numero di colonne, solo raggruppate insieme.

Esiste una soluzione che utilizza i pacchetti data.table , plyr o altro?

Il modo data.table è:

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

o

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

dove .SD è il (S) ubset di (D) ata escludendo le colonne di gruppo. (A parte: se è necessario fare riferimento a colonne di gruppo genericamente, sono in .BY .)

Questo sembra un compito per ddply (io uso il set di dati ‘baseball’ che è incluso in plyr):

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

Questo dà per groupColumns la sum delle colonne specificate in dataColumns.

Nella base R questo sarebbe …

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

EDIT : la funzione aggregata ha fatto molta strada da quando ho scritto questo. Nessuno dei casting sopra è necessario.

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

E ci sono molti modi per scrivere questo. Supponendo che le prime 10 colonne siano denominate da 1 a 10, mi piace quanto segue, anche se è prolissa.

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

(Puoi usare paste per build la formula e usare la formula )

Utilizzando plyr :: ddply:

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

Il modo dplyr sarebbe:

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

Puoi inoltre specificare le colonne da riepilogare o escludere da summarise_each usando le funzioni speciali menzionate nel file di aiuto di ?dplyr::select .

Un altro modo per farlo con dplyr che sarebbe generico (non è necessario un elenco di colonne) sarebbe:

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

Il modo semplice e corretto con data.table cui è ansible selezionare e deselezionare le colonne che si desidera per il raggruppamento e il suming è:

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] ) ]