如何编写接收变量名作为输入、调用dplyr管道的R自定义函数
问题原因
你给出的基础代码无法正常运行,是因为dplyr采用非标准求值规则,函数参数
var会被默认当作数据集里的列名直接查找,不会解析为你传入的变量参数。
最简可运行实现(tidyverse推荐方案)
用大括号运算符{{ }}(又称curly-curly)直接包裹参数,告诉dplyr解析传入的变量表达式即可:
library(dplyr) test <- function(var){ iris %>% group_by(Species) %>% summarise(mean_val = mean({{var}}, na.rm = TRUE)) }
调用示例:
# 直接传入列名即可返回分组均值结果 test(Sepal.Length)
扩展复杂功能实现
- 支持传入字符串格式的变量名:用
.data代词取对应列
test_str <- function(var_str){ iris %>% group_by(Species) %>% summarise(mean_val = mean(.data[[var_str]], na.rm = TRUE)) } # 调用示例 test_str("Sepal.Width")
- 支持同时传入多个变量批量计算
如果使用R4.1以下版本,将代码中的\(x)替换为function(x)即可正常运行
test_multi <- function(...){ iris %>% group_by(Species) %>% # across批量处理传入的所有列,.names参数自定义输出列名格式 summarise(across(c(...), \(x) mean(x, na.rm = TRUE), .names = "mean_{.col}")) } # 调用示例,一次计算多个列的分组均值 test_multi(Sepal.Length, Sepal.Width, Petal.Length)
- 支持自定义数据集作为输入,适配任意场景
test_general <- function(data, group_col, val_col){ data %>% group_by({{group_col}}) %>% summarise(mean_val = mean({{val_col}}, na.rm = TRUE)) } # 调用示例,可传入任意数据集、分组列、计算列 test_general(mtcars, group_col = cyl, val_col = mpg)
内容的提问来源于stack exchange,提问作者gecko
相关产品推荐
相关产品推荐

