在R中使用!=比较同一数据框两列时结果异常的问题咨询
问题原因
你遇到的是double类型数值比较的经典浮点精度误差问题:
double类型在计算机中以二进制格式存储,绝大多数十进制小数无法被二进制精确表示,会存在人类肉眼无法感知的极小尾差,直接使用==或!=做精确比较时,这些尾差会被判定为值不相等。同时如果列中存在NA值,NA 与任意值比较都会返回NA,不会被两个filter条件匹配,自然就会出现两个筛选结果不互补的情况。
解决方案
你可以改用以下方法完成比较:
- 使用浮点近似相等函数:
dplyr内置的near()函数专门用于浮点型数值比较,会默认忽略小于机器精度的误差,筛选不等值的代码可修改为:
df %>% filter(!near(column1, column2))
如果需要自定义误差容忍阈值,可添加tol参数,例如下方代码将误差小于1e-6的数值判定为相等:
df %>% filter(!near(column1, column2, tol = 1e-6))
- 补充NA值处理规则:如果需要将“仅其中一列为NA”的情况判定为不相等,可调整代码为:
df %>% filter(!near(column1, column2) | xor(is.na(column1), is.na(column2)))
- 高精度场景可转换类型后比较:如果对数值精度要求极高,可将两列统一放大指定倍数转换为整数,或者对齐小数位数后转换为字符串,再做精确比较。
调整后即可覆盖所有行的比较逻辑,两个互斥条件的筛选结果也会实现互补。
内容的提问来源于stack exchange,提问作者Seungmin Lim
相关产品推荐
相关产品推荐

