如何在dplyr的mutate()中用变量替代列名执行计算?
在dplyr中用变量替代列名的解决方法
这个问题我太熟啦!你遇到的报错是因为R把x和y当成普通字符串在做拼接,而不是识别成数据框的列名来计算数值和。下面给你几个实用的解决办法,都是tidyverse里常用的方案:
方法1:使用.data代词(推荐)
这是tidyverse官方推荐的方式,语法清晰易懂,不需要额外依赖:
x = "Sepal.Length" y = "Sepal.Width" head(iris %>% mutate(sum = .data[[x]] + .data[[y]]))
.data是一个特殊的代词,用来指代当前操作的数据框(这里就是iris),用[[ ]]可以直接把字符串变量转换成对应的列,这样就能正常做数值运算了。
方法2:用符号转换+准引用(sym() + !!)
如果习惯用非标准求值的写法,可以把字符串转成dplyr能识别的符号,再用!!解除引用:
x = "Sepal.Length" y = "Sepal.Width" # 先把字符串转成符号 x_sym = sym(x) y_sym = sym(y) head(iris %>% mutate(sum = !!x_sym + !!y_sym))
sym()函数会把字符串转换成R里的“符号”对象(也就是列名对应的标识),!!的作用是告诉dplyr:“别把这个变量当成普通对象,把它解析成对应的列名来用”。
方法3:用across()处理(适合多列场景)
如果需要对多列做类似操作,across()会更灵活,哪怕这里只有两列也能用:
x = "Sepal.Length" y = "Sepal.Width" head(iris %>% mutate(sum = rowSums(across(c(x, y)))))
across(c(x, y))会选中指定的列,rowSums()可以直接计算每行的和,要是你想手动做加法,写成across(x) + across(y)也完全没问题。
为什么你的原代码会报错?
你写的x+y其实是在做字符串拼接,R会把两个字符串"Sepal.Length"和"Sepal.Width"拼成"Sepal.LengthSepal.Width",这是字符类型的操作,不是数值加法,所以才会提示“non-numeric argument to binary operator”(给二元运算符传入了非数值参数)。
内容的提问来源于stack exchange,提问作者Ajjit Narayanan
相关产品推荐
相关产品推荐

