You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于外部命名向量通过dplyr非标准评估创建新变量

问题:基于外部向量通过程序化非标准评估实现dplyr分组汇总

我原本通过以下代码对mtcars数据集按am分组,并汇总三个统计量:

library(dplyr)
mtcars %>%
    group_by(x = am) %>%
    summarize(y = sum(vs),
              q = sum(mpg),
              p = sum(mpg/vs))

执行结果如下:

#> # A tibble: 2 × 4
#>       x     y     q     p
#>   <dbl> <dbl> <dbl> <dbl>
#> 1     0     7  326.   Inf
#> 2     1     7  317.   Inf

现在我希望基于以下两个外部向量来完成相同的分组与汇总操作:

x_groups <- c("x" = "am")
y_now <- c("y" = "vs", "q" = "mpg", "p" = "mpg/vs")

请问如何通过程序化的非标准评估方法得到与上述代码一致的结果?


解决方法

可以利用dplyr提供的非标准评估工具实现需求,具体代码如下:

library(dplyr)
library(purrr)

x_groups <- c("x" = "am")
y_now <- c("y" = "vs", "q" = "mpg", "p" = "mpg/vs")

# 将字符串向量转换为符号对象
group_syms <- syms(x_groups)
# 批量生成汇总计算表达式
summarise_exprs <- map(syms(y_now), ~ quo(sum(!!.x)))

mtcars %>%
  group_by(!!!group_syms) %>%
  summarise(!!!summarise_exprs)

代码说明:

  • syms():把字符串形式的列名/表达式转换为dplyr可识别的符号对象;
  • quo() + !!:quo()创建引用的表达式,!!(单插值操作符)将符号对象插入sum()函数,生成每个统计量的计算逻辑;
  • !!!(拼接操作符):将符号对象或表达式列表展开到group_by和summarise的参数中,实现程序化调用;
  • map():遍历汇总表达式的符号列表,批量生成所有统计量的计算规则。

执行后会得到和原始代码完全一致的输出结果。


内容的提问来源于stack exchange,提问作者Alberto Agudo Dominguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:25:04