使用dplyr的汇总和summarise_each一起?

时间:2015-08-04 17:08:00

标签: r dplyr

我想同时应用dplyr::summarisedplyr::summarise_each分组数据框。有可能吗?

我的数据如下:

mydf <- data.frame(
    id = c(rep(1,2), rep(2, 3), rep(3, 4)), 
    amount = c(rep(1,4), rep(2,5)), 
    type1 = c(rep(1, 2), rep(0, 7)),
    type2 = c(rep(0, 4), rep(1, 5))
)
mydf
#  id amount type1 type2
#1  1      1     1     0
#2  1      1     1     0
#3  2      1     0     0
#4  2      1     0     0
#5  2      2     0     1
#6  3      2     0     1
#7  3      2     0     1
#8  3      2     0     1
#9  3      2     0     1

我想总结id amount变量并获取type变量的最大值。我知道我可以这样做:

mydf %>% 
    group_by(id) %>% 
    summarise(amount = sum(amount), type1 = max(type1), type2 = max(type2))

但是,我有很多type变量,所以我更喜欢这样的东西(但是amount的总和)。

mydf %>%
    group_by(id) %>%
    summarise_each(funs(max), matches("type"))

3 个答案:

答案 0 :(得分:9)

使用dplyr

library(dplyr)

mydf %>% 
     group_by(id) %>% 
     mutate(amount = sum(amount)) %>% 
     mutate_each(funs(max), matches("type")) %>%
     unique

#Source: local data table [3 x 4]

#  id amount type1 type2
#1  1      2     1     0
#2  2      4     0     1
#3  3      8     0     1

或者只是作为@HongOoi指示

mydf %>% 
     group_by(id) %>% 
     mutate(amount=sum(amount)) %>% 
     summarise_each(funs(max))

答案 1 :(得分:7)

我不确定使用dplyr的惯用方法,但使用data.table非常惯用

library(data.table)
setDT(mydf)[, c(amount = sum(amount), 
                lapply(.SD[, grep("type", names(mydf), value = TRUE), with = FALSE], max)),
            by = id]
#    id amount type1 type2
# 1:  1      2     1     0
# 2:  2      4     0     1
# 3:  3      8     0     1

基本上,我们使用c合并两个操作,而lapply(.SD, max)代表mutate_each中的dplyr,而matches只是{{1}的包装器(如清楚显示in the source code)。 grep用于标准评估with = FALSEdata.table父框架中的列名称(代表 S ub D ata)

答案 2 :(得分:1)

使用dplyr的更一般方法可能是:

mydf %>%
  group_by(id) %>%
  mutate_each('sum', amount) %>%
  mutate_each('max', matches("type")) %>%
  summarise_each('first', amount, matches("type"))

这样做的好处是只对Veerendra Gadekar的原始答案中的每一列应用一个聚合函数。如果我们需要sd或类似代替max,它会很方便,Hong Ooi的解决方案会在这种情况下破裂。如果有字符列,它也会中断。第三个优点是它丢弃了不属于计算的列。

另见my related question