Может ли dplyr суммировать несколько переменных без перечисления каждой из них? [дубликат]
этот вопрос уже есть ответ здесь:
- Агрегировать / суммировать несколько переменных в группе (например, sum, mean) 5 ответов
dplyr удивительно быстро, но мне интересно, если я что-то упускаю: можно ли суммировать по нескольким переменным. Например:
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)
С этим малым dataframe, легко пиши
summarise(dg,mean(age),mean(bmi),mean(chol))
и я знаю, что, чтобы получить то, что я хочу, я мог бы расплавить, получить средства, а затем dcast, такие как
dm=melt(df, id.var='sex')
dmg=group_by(dm, sex, variable);
x=summarise(dmg, means=mean(value))
dcast(x, sex~variable)
но что, если у меня >20 переменных и очень большое количество строк. Есть ли что-нибудь похожее на .SD в данных.таблица, которая позволила бы мне взять средства всех переменных в сгруппированном фрейме данных? Или, возможно ли как-то использовать lapply на сгруппированном фрейме данных?
Спасибо за помощь
2 ответа:
The
data.table
фразеологизмlapply(.SD, mean)
, которая составляет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
Я не уверен, что от
dplyr
идиома, то же самое, но вы можете сделать что-то вроде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
обратите внимание, что есть проблема github #178 чтобы эффективно использовать тег
plyr
идиоматическое выражениеcolwise
наdplyr
.