Est-ce que dplyr peut résumer plusieurs variables sans lister chacune?

dplyr est incroyablement rapide, mais je me demande s’il me manque quelque chose: est-il possible de résumer plusieurs variables. Par exemple:

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) 

Avec ce petit dataframe, il est facile d’écrire

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

Et je sais que pour obtenir ce que je veux, je pourrais fondre, obtenir les moyens, puis diffuser comme

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

Mais que faire si j’ai> 20 variables et un très grand nombre de lignes. Y at-il quelque chose de similaire à .SD dans data.table qui me permettrait de prendre en compte toutes les variables dans le bloc de données groupé? Ou est-il possible d’utiliser d’une manière ou d’une autre le fichier de données groupé?

Merci pour toute aide

Le idiome data.table est lapply(.SD, mean) , qui est

 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 

Je ne suis pas sûr d'un idiome de dplyr pour la même chose, mais vous pouvez faire quelque chose comme

 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 

Notez qu'il existe un problème github # 178 pour implémenter efficacement l'idiome colwise dans dplyr .

dplyr maintenant dplyr :

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