data.table执行过滤操作得到非预期结果的问题咨询
问题原因及解决方案
第一步先做基础校验
首先运行以下命令确认赋值前后的值完全一致:
identical(stringVector[1], template)
如果返回FALSE,说明赋值过程中出现了隐式转换,常见的可能性包括:
- stringVector本身是因子类型,赋值后template被隐式转为字符型,和
FieldLabel列的因子类型匹配异常 - 字符串携带的编码、不可见字符(比如换行、空格、特殊转义符)在赋值过程中发生了变化
可进一步打印两个值的原始字节确认差异:
charToRaw(stringVector[1]) charToRaw(template)
校验通过后优先排查作用域冲突
如果identical返回TRUE,90%以上的概率是data.table的作用域优先级规则导致的:
data.table在[]内的表达式默认优先查找数据表自身的列名,再查找全局环境的变量。如果你的dataSet中刚好存在名为template的列,此时dataSet[FieldLabel == template]实际是在比较FieldLabel列和同表的template列,而非你在外部定义的template变量,自然会出现结果为空的情况。而第一种写法中stringVector[1]没有匹配到同名列,会自动查找外部环境的变量,所以结果正常。
对应解决方法可任选其一:
- 使用data.table提供的双点前缀,明确指定取外部环境变量:
dataSet[FieldLabel == ..template] - 用
get函数指定查找环境,避免列名冲突:dataSet[FieldLabel == get("template", envir = .GlobalEnv)] - 将外部变量重命名为不和数据表列名重复的名称,例如
filter_template后再执行过滤。
内容的提问来源于stack exchange,提问作者koteletje
相关产品推荐
相关产品推荐

