R中使用data.table结合正则表达式过滤数值行无结果如何解决
问题根因
你的ID列为数值类型(integer/numeric),而grep()仅对字符向量生效:数值传入grep()时会被强制转换为字符,若数值过大R会默认采用科学计数法表示,例如9123000000会被转成"9.123e+09",自然无法匹配末尾6个0的正则规则。
修正方案
你可以任选以下一种方法解决:
- 方法1:过滤时临时将ID转为字符,无需修改原表
dt[grep("000000$", as.character(ID))] - 方法2:将ID列永久转为字符型(ID为标识类数据,本身不需要参与数值计算,该方案更合理),修改后你的原代码即可直接生效
# 先修改列类型 dt[, ID := as.character(ID)] # 原过滤代码可直接运行 dt[grep("000000$", ID)] - 方法3:针对数值型ID直接用数值逻辑判断,性能更高
# 末尾6个0的整数对1000000取模结果为0 dt[ID %% 1000000 == 0]
补充:如果是强制转换时科学计数法导致的匹配失败,你也可以先运行options(scipen=999)关闭R的科学计数法输出,也能临时解决问题,但不如上述三种方案稳定。
内容的提问来源于stack exchange,提问作者ron
相关产品推荐
相关产品推荐

