R data.table中使用paste0时get(x)失效问题求助
解决data.table循环中get函数报错问题
问题背景
运行conTMLE函数时触发报错:
Error in get(paste0("int.A", k)) : first argument has length > 1
问题出在循环内的data.table赋值代码:
dt[, (paste0("W", k+1)):=(get(paste0("int.A", k)))/(get(paste0("fit.A", k)))]
尝试过添加as.character、循环内定义j=k(触发新报错eval(jsub, SDenv, parent.frame()) : object 'j' not found)、变量名前加..前缀等方法均无效。
解决方法
方法1:用..前缀明确引用外部循环变量
data.table中..前缀用于访问外部环境的变量,避免将循环变量k误解析为data.table的列。修改代码为:
dt[, (paste0("W", ..k + 1)) := get(paste0("int.A", ..k)) / get(paste0("fit.A", ..k))]
这样k会取当前循环的单个值,paste0生成唯一的列名字符串,get函数就能正常工作。
方法2:提前构造列名字符串
将列名拼接逻辑移到循环体外部,减少j表达式中的环境解析操作:
# 替换1:n为你的实际循环范围 for(k in 1:n){ int_col <- paste0("int.A", k) fit_col <- paste0("fit.A", k) new_col <- paste0("W", k + 1) dt[, (new_col) := get(int_col) / get(fit_col)] }
方法3:使用.SD引用列
.SD是data.table的当前子集对象,用.SD[[colname]]替代get函数,更符合data.table原生语法:
dt[, (paste0("W", ..k + 1)) := .SD[[paste0("int.A", ..k)]] / .SD[[paste0("fit.A", ..k)]]]
内容的提问来源于stack exchange,提问作者香结丁
相关产品推荐
相关产品推荐

