kgo*_*aev 1 eval r dplyr tidyeval
我想创建一个函数dplyr,对数据子集执行某些操作。子集由数据集中一个或多个键列的值定义。当仅使用一列来标识子集时,我的代码可以正常工作:
set.seed(1)
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 2, 1),
a = sample(5)
)
group_key <- "g1"
aggregate <- function(df, by) {
df %>% group_by(!!sym(by)) %>% summarize(a = mean(a))
}
aggregate(df, by = group_key)
Run Code Online (Sandbox Code Playgroud)
这将按预期工作,并返回如下内容:
# A tibble: 2 x 2
g1 a
<dbl> <dbl>
1 1 1.5
2 2 4
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果我改变一切,一切都会崩溃group_key:
# A tibble: 2 x 2
g1 a
<dbl> <dbl>
1 1 1.5
2 2 4
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:Only strings can be converted to symbols,我认为来自rlang::sym()。用替换它syms()不起作用,因为我得到了一个名字列表,在上面列出了一些问题group_by()。
任何建议,将不胜感激!
您需要使用unquote-splice运算符!!!:
aggregate <- function(df, by) {
df %>% group_by(!!!syms(by)) %>% summarize(a = mean(a))
}
group_key <- c("g1", "g2")
aggregate(df, by = group_key)
## A tibble: 4 x 3
## Groups: g1 [2]
# g1 g2 a
# <dbl> <dbl> <dbl>
#1 1 1 1
#2 1 2 4
#3 2 1 2.5
#4 2 2 5
Run Code Online (Sandbox Code Playgroud)