我试图加入两个数据框(data.tables),x和y,在x $ val> = y $ start& x $ val< = y $ end。我不能使用dplyr,因为在dplyr中进行不等式连接的唯一方法是连接表然后过滤不等式,我想要加入的表有315k和84k记录。这会炸掉记忆。
data.table确实有不等式连接,但我不能为我的生活弄清楚语法是如何工作的。看到这个结果:
x <- data.table(val = c(1:5), id = "a")
y <- data.table(start = c(1:5), end = c(11:15), id= "a")
x[y, on=c("val>=start","val<=end"),
.(start, val, end)]
start val end
1: 1 1 11
2: 1 1 11
3: 1 1 11
4: 1 1 11
5: 1 1 11
6: 2 2 12
7: 2 2 12
8: 2 2 12
9: 2 2 12
10: 3 3 13
11: 3 3 13
12: 3 3 13
13: 4 4 14
14: 4 4 14
15: 5 5 15
为了展示我期望得到的东西,这是dplyr产生的:
x <- data.table(val = c(1:5), id = "a")
y <- data.table(start = c(1:5), end = c(11:15), id= "a")
x %>%
inner_join(y) %>%
filter(val >= start & val <= end)
val id start end
1 1 a 1 11
2 2 a 1 11
3 2 a 2 12
4 3 a 1 11
5 3 a 2 12
6 3 a 3 13
7 4 a 1 11
8 4 a 2 12
9 4 a 3 13
10 4 a 4 14
11 5 a 1 11
12 5 a 2 12
13 5 a 3 13
14 5 a 4 14
15 5 a 5 15
任何人都可以用data.table语法解释它是什么吗?
答案 0 :(得分:0)
您需要从左表中选择带有前缀(val
)的x.
列;有关详细信息,请参阅this answer:
x[y, on=.(val >= start, val <= end), .(val = x.val, id, start, end)][order(val)]
# ^^
# val id start end
#1: 1 a 1 11
#2: 2 a 1 11
#3: 2 a 2 12
#4: 3 a 1 11
#5: 3 a 2 12
#6: 3 a 3 13
#7: 4 a 1 11
#8: 4 a 2 12
#9: 4 a 3 13
#10: 4 a 4 14
#11: 5 a 1 11
#12: 5 a 2 12
#13: 5 a 3 13
#14: 5 a 4 14
#15: 5 a 5 15