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
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
.
dplyr
a maintenant summarise_each
:
df %>%
group_by(sex) %>%
summarise_each(funs(mean))