如何用单个参数在dplyr函数中按指定首列排序汇总结果?
用单个参数实现按汇总列首元素排序的R函数
可以通过捕获参数的表达式并提取第一个元素来实现,无需额外添加参数。这里提供两种可行的实现方式:
方法1:使用ensyms捕获列符号列表
library(dplyr) library(rlang) foo <- function(sum_col) { # 将传入的列参数转换为符号列表 sum_cols <- ensyms({{sum_col}}) sales_df %>% group_by(styleFam, prepack) %>% # 用!!!展开符号列表进行汇总 summarize(across(!!!sum_cols, sum)) %>% # 取列表第一个元素进行降序排序 arrange(desc(!!sum_cols[[1]])) } # 调用方式不变 foo(sum_col = c(soldUnits, extPrice))
方法2:直接提取c()表达式的第一个元素
如果不想依赖rlang的ensyms,可以直接处理传入的表达式:
library(dplyr) foo <- function(sum_col) { # 捕获sum_col的完整表达式 sum_col_expr <- enquo(sum_col) # 提取c()调用中的第一个列元素 first_sort_col <- quo_get_expr(sum_col_expr)[[2]] sales_df %>% group_by(styleFam, prepack) %>% summarize(across({{sum_col}}, sum)) %>% arrange(desc(!!first_sort_col)) } # 调用示例 foo(sum_col = c(soldUnits, extPrice))
原理说明
{{sum_col}}是dplyr的整洁评估语法,用于捕获传入的列参数;ensyms()会将多个列名转换为符号向量,方便后续提取第一个元素;!!(非引号操作符)用于将提取出的列符号注入到arrange函数中,实现动态排序。
内容的提问来源于stack exchange,提问作者bmfnerfherder
相关产品推荐
相关产品推荐

