web-dev-qa-db-fra.com

Dplyr peut-il résumer plusieurs variables sans les lister?

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 cadre de données, 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 jeté tel que

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

Mais que se passe-t-il si j'ai plus de 20 variables et un très grand nombre de lignes? Existe-t-il quelque chose de similaire à .SD dans data.table qui me permettrait de prendre la moyenne de toutes les variables du bloc de données groupées? Ou est-il possible d'utiliser d'une manière ou d'une autre lapply sur le bloc de données groupé?

Merci pour toute aide

73
David F

L'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 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 avec github # 178 pour implémenter efficacement le plyr idiome colwise dans dplyr.

44
mnel

dplyr a maintenant summarise_each:

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