在 dplyr 0.6 中对多个以编程方式指定的变量进行分组
Grouping on multiple programmatically specified vars in dplyr 0.6
这是新的 dplyr,即将发布。
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
的签名保持不变,即我将分组变量指定为单个向量,而不是通过 ...
参数。
有一个非常相似的问题:。我只是稍微修改了答案以使用 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
这是新的 dplyr,即将发布。
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
的签名保持不变,即我将分组变量指定为单个向量,而不是通过 ...
参数。
有一个非常相似的问题: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