首页 文章

dplyr可以汇总几个变量而不列出每个变量吗? [重复]

提问于
浏览
71

这个问题在这里已有答案:

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)

使用这个小型数据帧,它很容易编写

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个变量和非常多的行呢?在data.table中是否有类似于.SD的东西可以让我采用分组数据框中所有变量的方法?或者,是否有可能以某种方式在分组数据框架上使用lapply?

谢谢你的帮助

2 回答

  • 42

    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
    

    我不确定同一个东西,但你可以做类似的事情

    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可以有效地实现 dplyr 中的 plyr idiom colwise .

  • 114

    dplyr 现在 summarise_each

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

相关问题