在R语言自定义函数中使用标准评估操作列名的问题
解决方案
你的代码无法运行的核心问题是:在dplyr::mutate中,不能直接将动态生成的字符串(如paste0(x,y,'_sub'))放在等号左侧作为列名,常规的=不支持动态列名赋值。以下是两种符合你要求(不使用{{}}或整洁评估)的解决方法:
方法一:使用Base R原生操作(推荐,纯标准评估)
直接通过数据框的索引语法添加新列,完全无需依赖dplyr的特殊语法:
cal <- function(data, x, y) { # 生成新列名 new_col_name <- paste0(x, y, '_sub') # 直接给数据框添加新列 data[[new_col_name]] <- data[[x]] - data[[y]] return(data) }
方法二:结合dplyr的:=运算符
如果坚持使用dplyr的mutate,可以用:=实现动态列名赋值(此写法未使用{{}},仅用基础的动态解析):
cal <- function(data, x, y) { new_col_name <- paste0(x, y, '_sub') data <- dplyr::mutate(data, !!new_col_name := data[[x]] - data[[y]]) return(data) }
测试验证
用你的测试数据运行:
id <- 1:30 math <- rnorm(30,1,10) history <- rnorm(30,1,10) data <- data.frame(id,math,history) results <- cal(data,'math','history') # 查看结果前几行 head(results)
运行后会成功生成名为mathhistory_sub的新列,存储math与history的差值。
内容的提问来源于stack exchange,提问作者Tube
相关产品推荐
相关产品推荐

