【发布时间】:2016-03-28 16:44:37
【问题描述】:
有谁知道使用dplyr::group_by 时选择“all-but-one”(或“all-but-a-few”)列的快速方法?
最终,我只想在删除一些选择列后聚合所有不同的行,但我不想每次都明确列出所有分组列(因为在我的分析中这些列被频繁添加和删除)。
例子:
> df <- data_frame(a = c(1,1,2,2), b = c("foo", "foo", "bar", "bar"), c = runif(4))
> df
Source: local data frame [4 x 3]
a b c
(dbl) (chr) (dbl)
1 1 foo 0.95460749
2 1 foo 0.05094088
3 2 bar 0.93032589
4 2 bar 0.40081121
现在我想通过a 和b 聚合,所以我可以这样做:
> df %>% group_by(a, b) %>% summarize(mean(c))
Source: local data frame [2 x 3]
Groups: a [?]
a b mean(c)
(dbl) (chr) (dbl)
1 1 foo 0.5027742
2 2 bar 0.6655686
太好了。
但是,我真的希望能够做一些事情,比如只指定 not c,类似于 dplyr::select(-c):
> df %>% select(-c)
Source: local data frame [4 x 2]
a b
(dbl) (chr)
1 1 foo
2 1 foo
3 2 bar
4 2 bar
但是group_by 可以应用表达式,所以等价的不起作用:
> df %>% group_by(-c) %>% summarize(mean(c))
Source: local data frame [4 x 2]
-c mean(c)
(dbl) (dbl)
1 -0.95460749 0.95460749
2 -0.93032589 0.93032589
3 -0.40081121 0.40081121
4 -0.05094088 0.05094088
有人知道我是否只是缺少帮助我快速完成此操作的基本功能或快捷方式吗?
示例用例:如果df 突然获得一个新列d,我希望下游代码现在聚合a、b、和的唯一组合d,无需我将 d 显式添加到 group_by 调用中。)
【问题讨论】:
-
df %>% group_by_(.dots = setdiff(names(df), "c")) %>% summarize(mean(c))也许? -
是的,这就是我所决定的,只是看起来……有点笨拙。我认为可能有一些(我不知道的)函数可以“保护”像
-c这样的表达式免于立即评估,然后可以将其视为在select调用中生成的。但一般来说,是的,group_by_和setdiff可以解决问题,谢谢! -
我同意人们可以认为这应该可以工作,因为这看起来像一个典型的 dplyr 语法也许查找 GH 上是否存在现有的 FR,或者这可能是在开发版本中实现的。如果没有,你可以做一个 FR 看看效果如何。
-
不比 @DavidArenburg 的
setdiff好,但我猜在 Hadleyverse 中仍然会是df %>% group_by_(.dots = select_vars(names(.), -c)) %>% summarize(mean(c))。 -
目前可以使用
across()。