r - 如何使用列名向量作为 dplyr::group_by() 的输入?

标签 r dplyr eval 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)

这按预期工作并返回如下内容:
# A tibble: 2 x 2
     g1     a
  <dbl> <dbl>
1     1   1.5
2     2   4  

不幸的是,如果我改变,一切都会崩溃 group_key :

group_key <- c("g1", "g2")
aggregate(df, by = group_key)

我收到一个错误:Only strings can be converted to symbols ,我认为来自 rlang::sym() .将其替换为 syms()不起作用,因为我得到了一个姓名列表,其中 group_by()窒息。

任何建议,将不胜感激!

最佳答案

您需要使用取消引用拼接运算符 !!! :

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 

关于r - 如何使用列名向量作为 dplyr::group_by() 的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56997814/

相关文章:

如果 r 中的值变为负数,则重置 cumsum

r - dplyr::count() 不适用于 MacOS

python - eval 和 exec 究竟如何与 __future__ 交互?

c# - ASP.NET:在 if 语句中使用 Eval

R - 在数据框中查找字符串的每个位置

regex - 在 R 中修剪字符串

R聚类 'purity'指标

r - 如何使用geom_map用各自的国旗填充国家?

r - "R: dplyr: How to add a column that divides a value by the first group of values (kind of like a vlookup)"

emacs - 存储 sexp 评估,以便可以在其他地方调用它 (Emacs Lisp)