如何查找两个含price、size列的不同长度R dataframe的差异
DataFrame订单差异对比可行方案
问题根因
你之前的方案报错/结果不准主要有两个核心原因:
- 浮点数精度问题:price、size均为浮点型数据,存储时的微小精度误差会导致完全匹配逻辑判定为不相等
- comparedf报错大概率是因为存在大量重复的price+size组合,触发了data.table的笛卡尔连接安全限制
推荐解决方案(适配你提供的data.table格式数据)
步骤1:先为两张表添加原始行号,用于后续定位
步骤2:统一浮点精度后做反连接,分别提取两张表独有的记录
对应可直接运行的代码:
library(data.table) # 新增原始行号列 out[, original_row := .I] bit[, original_row := .I] # 按业务精度统一舍入,避免浮点误差,可根据实际需求调整小数位数 out[, `:=`(price_round = round(price, 2), size_round = round(size, 8))] bit[, `:=`(price_round = round(price, 2), size_round = round(size, 8))] # 提取out存在、bit不存在的记录 out_unique <- out[!bit, on = .(price_round, size_round)] # 提取bit存在、out不存在的记录 bit_unique <- bit[!out, on = .(price_round, size_round)] # 可选:删除临时生成的舍入列,保留原始数据和行号 out_unique[, c("price_round", "size_round") := NULL] bit_unique[, c("price_round", "size_round") := NULL]
结果说明
- out_unique中的
original_row列对应原out表的行号,可直接定位差异位置 - bit_unique中的
original_row列对应原bit表的行号 - 如果业务不允许舍入,可以调整匹配逻辑,用近邻匹配设置公差阈值即可
内容的提问来源于stack exchange,提问作者MrJingle02
相关产品推荐
相关产品推荐

