【发布时间】:2019-11-14 08:10:33
【问题描述】:
我正在使用一个名为“lines”的 data.table,它使用 2 个二进制索引创建
setkeyv(lines,c("start","end"))
我需要执行快速二分搜索来查找“开始”列或“结束”列中的哪些记录等于一个值(或多个),例如,在 SQL 中它会是这样的:
select column1, column2, column3 from lines where start = 2 OR end = 2
在带有二进制索引的 R data.tables 中,我可以这样做
lines[.(2,2)]
但是这句话等于start = 2 AND end = 2,这不是我需要的。
我知道用这样的方法可以做到这一点,但它不够快,而且它不使用二进制搜索。
line[(start == c(2,3) | end == c(2,3)];
如何根据此要求执行快速搜索?
我需要做的一个简单示例。
lines <- data.table(id = c(1,2,3,4,5,6,7), start = c(901,902,903,904,905,906,907), end = c(101,102,103,104,105,106,107));
checklines <- data.table(id = c(1,2,3,4), startcheck = c(330,902,903,101), endcheck = c(106,400,907));
setkeyv(lines, c("start","end");
我需要搜索start OR end的值为checklines startcheck或endcheck的值的行中的记录。
我现在做的是:
lines[start %in% c(checklines$startcheck,checklines$endcheck) | end %in% c(checklines$startcheck,checklines$endcheck)];
结果将是:
但是这个搜索速度不够快,如果我没记错的话,它不使用二进制键。
【问题讨论】:
-
是的,对我来说似乎是个骗局……哦,等等,不是,因为您的两列都具有相同的类型,并且可以像您发布的答案一样融化。顺便说一句,我认为二进制搜索或查询的一般问题属于这个多部分问题:github.com/Rdatatable/data.table/issues/1453
标签: r data.table