如何基于外部命名向量通过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
相关产品推荐
相关产品推荐

