data.table列名与环境变量重名时的过滤问题
解决data.table列名与环境变量同名时的过滤问题
当data.table的列名和全局环境中的变量名重复时,在i参数中会优先引用列名,导致过滤逻辑不符合预期。比如这段代码:
dt = data.table(myvar = 1:10) myvar = 2 dt[myvar %in% myvar]
执行后会返回所有行,因为两边的myvar都被解析为data.table的列,相当于判断列中每个值是否存在于该列的所有值中,结果全为TRUE。而我们期望只返回myvar=2的行。
解决方案
- 方法1:使用
..前缀引用全局环境变量..是data.table的专属语法,用来表示“向上查找一级环境”(即全局环境):
dt[myvar %in% ..myvar]
- 方法2:用
get()指定环境
明确指定从全局环境读取目标变量:
dt[myvar %in% get("myvar", envir = .GlobalEnv)]
- 方法3:重命名临时变量
把全局变量赋值给一个不重名的临时变量,从根源避免命名冲突:
target_val = myvar dt[myvar %in% target_val]
以上三种方法都能得到预期结果:
myvar 1: 2
内容的提问来源于stack exchange,提问作者Zhaochen He
相关产品推荐
相关产品推荐

