R加入data.table

时间:2017-12-04 15:49:20

标签: r join dplyr data.table

我试图加入两个数据框(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语法解释它是什么吗?

1 个答案:

答案 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