我有一个大型数据集,希望形成满足某个条件的所有行对,然后根据满足的条件部分计算一些变量。下面的MWE说明了我希望实现的目标:
library(data.table)
set.seed(1234)
IDs <- data.table(id = letters[1:10],
c1 = sample(1:5, 10, replace = T),
c2 = sample(1:5, 10, replace = T),
c3 = sample(1:5, 10, replace = T),
c = 1)
IDs.joined <- IDs[IDs, on = 'c', allow.cartesian = T
][c1 != i.c1 & (c2 == i.c2 | c3 == i.c3) # condition defining which pairs are joined
][, c('Ic2', 'Ic3') := .(c2 == i.c2, c3 == i.c3)
][, overlap_id := fifelse(Ic2 == 1, 2, 3)
][, overlap := Ic2 + Ic3
][, -c('i.c1', 'i.c2', 'i.c3', 'Ic2', 'Ic3')]
问题是整个数据集太大了(约500万行),无法在其自身上形成笛卡尔连接。我的问题是,是否有一种方法可以使用data.table
的语法直接执行这样的条件连接,而不必先通过笛卡尔连接,然后再施加所需的条件?
我在SO上看到过类似的问题,但这些问题通常可以表示为滚动连接,我不知道在滚动连接语法中包含X | Y
语句或X != Y
条件的方法。
1条答案
按热度按时间bcs8qyzn1#
到目前为止,我发现对于像这样相对简单的情况,最好的选择是绑定多个连接,这并不漂亮,但它速度快,内存效率高。
数据:
具有单个笛卡尔连接的原始解,然后进行所需的过滤:
使用四个不等连接,然后过滤掉重复项的解决方案:
使用两个笛卡尔连接的解决方案,每个连接后面都有附加过滤:
基准: