【发布时间】:2022-10-12 21:39:32
【问题描述】:
我有一个大数据集,想形成满足某些条件的所有行对,然后根据满足条件的哪些部分计算一些变量。以下 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 语句的方法。
【问题讨论】:
标签: r data.table self-join