【发布时间】:2021-02-26 15:55:19
【问题描述】:
在 dplyr::summarise 内部,如何根据与我正在汇总的行不同的行应用过滤器?
例子:
t = data.frame(
x = c(1,1,1,1,2,2,2,2,3,3, 3, 3),
y = c(1,2,3,4,5,6,7,8,9,10,11,12),
z = c(1,2,1,2,1,2,1,2,1,2, 1, 2)
)
t %>%
dplyr::group_by(x) %>%
dplyr::summarise(
mall = mean(y), # this should include all rows in each group
ma = mean(y), # this should only include rows where z == 1
mb = mean(y) # this should only include rows where z == 2
)
因此,这里的问题是将汇总函数应用于一列,同时基于另一列进行过滤,所有这些都在 summarise 内。
一个想法是双重分组,因此在 x 和 z 上都应用 group_by,但我不希望 所有 汇总列基于双重分组,有些(如 @987654324上例中的@) 应仅基于单一分组。
【问题讨论】:
-
两个想法:要么多次调用,然后加入,要么类似
ma = mean(ifelse (z==1, y, NA))。第二个选项给你答案 withinsummarise但是,恕我直言,非常丑陋而且绝对不整洁。 -
是的,
ifelse解决方案效果很好。我同意它不会“感觉”整洁,但它现在可以完成工作。如果我更好地理解这些 dplyr 函数及其符号列引用的魔力,我也许可以一起做一些更优雅的事情。