data.table中通过Excel命名区域动态引用列名关联报错问题
解决data.table动态列名关联报错问题
问题说明
现有两个data.table对象dark与road,原关联代码:
dark[road,"menti" :=.(i.cat) , on = .(walk >= rab) ]
可正常运行。但通过openxlsx从Excel命名区域读取列名(fromexcel值为"walk"),尝试用get(fromexcel)或eval(parse(text = fromexcel))动态引用列名编写on关联条件时,出现如下报错:
Error in colnamesInt(x, names(on), check_dups = FALSE) :
参数指定的列不存在:cols[1]='get(fromexcel)'
解决方案
data.table的on参数无法直接在.()内通过get()解析动态列名,需通过构建命名列表的方式传递动态关联条件,具体实现如下:
方法1:构建命名列表(推荐)
先创建对应动态列名的关联条件列表,再传入on参数:
# 构建动态关联条件:以fromexcel的值为列名,对应条件为>= rab on_condition <- list() on_condition[[fromexcel]] <- quote(>= rab) # 执行关联操作 dark[road, "menti" := .(i.cat), on = on_condition]
也可以用setNames简化写法:
on_condition <- setNames(list(quote(>= rab)), fromexcel) dark[road, "menti" := .(i.cat), on = on_condition]
方法2:解析完整关联表达式
通过parse构建完整的关联条件表达式,再用eval传入on参数:
# 拼接并解析关联表达式 on_expr <- parse(text = paste0(fromexcel, " >= rab")) # 执行关联操作 dark[road, "menti" := .(i.cat), on = eval(on_expr)]
原理说明
原写法中on = .(get(fromexcel) >= rab)会被data.table直接将get(fromexcel)识别为列名,而非执行函数获取动态列名,因此报错找不到对应列。而通过命名列表或解析完整表达式的方式,能让data.table正确识别动态传入的列名,执行预期的关联逻辑。
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

