这是新的dplyr,即将推出Real Soon Now。
dplyr programming vignette给出了一个使用外部函数中指定的分组变量调用group_by
的示例:
my_summarise <- function(df, group_var) {
df %>%
group_by(!!group_var) %>%
summarise(a = mean(a))
}
当提供单个分组变量时,此方法有效。但是,它失败了多个变量。
简化示例:
f <- function(x)
{
group_by(mtcars, !!x)
}
## works
g1 <- "cyl"
f(g1)
## doesn't work
#Error in mutate_impl(.data, dots) :
# Column `c("cyl", "gear")` must be length 32 (the number of rows) or one, not 2
g2 <- c("cyl", "gear")
f(g2)
如何在rlang框架内修复此问题?
理想情况下,我希望f
的签名保持不变,即我将分组变量指定为单个向量,而不是通过...
参数。
答案 0 :(得分:3)
有一个非常相似的问题:Programming with dplyr using string as input。我刚刚修改了答案,使用syms
和!!!
。
library(rlang)
f <- function(x){
group_by(mtcars, !!!syms(x))
}
f(c("cyl")) %>% summarise(n())
# A tibble: 3 x 2
cyl `n()`
<dbl> <int>
1 4 11
2 6 7
3 8 14
f(c("cyl", "gear")) %>% summarise(n())
# A tibble: 8 x 3
# Groups: cyl [?]
cyl gear `n()`
<dbl> <dbl> <int>
1 4 3 1
2 4 4 8
3 4 5 2
4 6 3 2
5 6 4 4
6 6 5 1
7 8 3 12
8 8 5 2