R语言data.table:使用变量存储列名计算的简洁语法问询
在data.table中使用变量存储的列名进行计算的简洁语法
我想在R的data.table里用变量存储的列名做计算,下面是最小复现代码,最后一行会失败:
library(data.table) dt = data.table(a = 1:5, b = letters[1:5]) myCol = "a" dt[, ..myCol] dt[, a := a - 3] dt[, (myCol) := a - 3] dt[, (myCol) := ..myCol - 3] # 此行失败,是不是因为R在计算"a" - 3?
目前我找到的方法是用eval(parse()):
dt[, (myCol) := eval(parse(text = myCol)) - 3]
想问有没有更简洁的语法?
当然有几种更简洁的写法,推荐以下几种:
使用
get()函数:
这是最直接的方法,get()可以根据字符串形式的列名提取对应列的数值向量:dt[, (myCol) := get(myCol) - 3]使用
.SD和.SDcols:.SDcols指定要操作的列,.SD会返回这些列组成的data.table,用[[1]]取出对应的向量:dt[, (myCol) := .SD[[1]] - 3, .SDcols = myCol]使用rlang包的符号解引用(适合习惯tidyverse语法的场景):
先把字符串转成符号,再用!!解引用让data.table识别为列名:library(rlang) dt[, (myCol) := !!sym(myCol) - 3]
另外你提到的最后一行代码失败的原因:..myCol是data.table中用于选择列的语法,它会返回对应列组成的data.table子集,而不是数值向量,所以执行..myCol - 3相当于让一个data.table减3,自然会报错。
内容的提问来源于stack exchange,提问作者mistral
相关产品推荐
相关产品推荐

