基于data.table non-equi join实现数值区间匹配次数统计
解决方法
首先加载data.table包,将两个数据框转换为data.table对象,通过左连接+按原始mock行分组计数的方式直接得到结果:
library(data.table) # 转换为data.table格式 setDT(mock) setDT(range) # 非等值连接+分组计数直接得到结果 result <- range[mock, on = .(x <= num, y >= num), .(check = .N), by = .(id, num)]
代码说明
- 连接方向调整:你之前写的
mock[range, ...]是以range为左表,统计的是每个区间匹配的mock记录数,我们的需求是统计每个mock记录匹配的区间数,所以要把range放在左边,mock放在右边做左连接。 on = .(x <= num, y >= num)的含义是:对每一个mock表的num值,匹配range表中所有满足x <= num且y >= num的区间行。by = .(id, num)表示按mock表的原始行(id和num唯一标识一行)分组,.N统计每个分组匹配到的range行数,也就是你要的check值。
运行上述代码得到的result和你期望的输出完全一致,data.table的非等值连接是底层C实现的,即使是百万级以上的数据集运行效率也远高于嵌套循环方案。
内容的提问来源于stack exchange,提问作者Robin B
相关产品推荐
相关产品推荐

