我想同时应用dplyr::summarise
和dplyr::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"))
答案 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 = FALSE
或data.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的解决方案会在这种情况下破裂。如果有字符列,它也会中断。第三个优点是它丢弃了不属于计算的列。