79 votes

Peut dplyr résumer sur plusieurs variables sans faire une liste de chacun?

dplyr est étonnamment rapide, mais je me demande si je suis absent quelque chose: est-il possible de résumer plus de 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 faire fondre, obtenir les moyens, et puis dcast 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. Est-il rien de semblable .SD de données.le tableau qui me permettrait de prendre les moyens de toutes les variables dans les données groupées cadre? Ou, est-il possible de faire en quelque sorte l'utilisation lapply sur les données groupées cadre?

Merci pour toute aide

120voto

rrs Points 1552

dplyr a maintenant summarise_each:

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

44voto

mnel Points 48160

L' data.table idiome lapply(.SD, mean), ce 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' dplyr idiome 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 y a un github question n ° 178 de efficienctly mettre en œuvre l' plyr idiome colwise en dplyr.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X