¿Puede dplyr resumir varias variables sin enumerar cada una?

dplyr es sorprendentemente rápido, pero me pregunto si me falta algo: ¿es posible resumir varias variables? Por ejemplo:

library(dplyr) library(reshape2) (df=dput(structure(list(sex = structure(c(1L, 1L, 2L, 2L), .Label = c("boy", "girl"), class = "factor"), age = c(52L, 58L, 40L, 62L), bmi = c(25L, 23L, 30L, 26L), chol = c(187L, 220L, 190L, 204L)), .Names = c("sex", "age", "bmi", "chol"), row.names = c(NA, -4L), class = "data.frame"))) sex age bmi chol 1 boy 52 25 187 2 boy 58 23 220 3 girl 40 30 190 4 girl 62 26 204 dg=group_by(df,sex) 

Con este pequeño dataframe, es fácil escribir

 summarise(dg,mean(age),mean(bmi),mean(chol)) 

Y sé que para obtener lo que quiero, podría derretirme, obtener los medios, y luego emitir como

 dm=melt(df, id.var='sex') dmg=group_by(dm, sex, variable); x=summarise(dmg, means=mean(value)) dcast(x, sex~variable) 

Pero qué pasa si tengo> 20 variables y una gran cantidad de filas. ¿Hay algo similar a .SD en data.table que me permita tomar las medias de todas las variables en el dataframe agrupado? O bien, ¿es posible usar de alguna manera lapply en el dataframe agrupado?

Gracias por cualquier ayuda

La expresión de data.table es lapply(.SD, mean) , que es

 DT <- data.table(df) DT[, lapply(.SD, mean), by = sex] # sex age bmi chol # 1: boy 55 24 203.5 # 2: girl 51 28 197.0 

No estoy seguro de una expresión dplyr para la misma cosa, pero puedes hacer algo como

 dg <- group_by(df, sex) # the names of the columns you want to summarize cols <- names(dg)[-1] # the dots component of your call to summarise dots <- sapply(cols ,function(x) substitute(mean(x), list(x=as.name(x)))) do.call(summarise, c(list(.data=dg), dots)) # Source: local data frame [2 x 4] # sex age bmi chol # 1 boy 55 24 203.5 # 2 girl 51 28 197.0 

Tenga en cuenta que existe un problema # 178 de github para implementar de manera eficiente la plyr idioma de colwise en dplyr .

dplyr ahora tiene summarise_each :

 df %>% group_by(sex) %>% summarise_each(funs(mean))