首页 文章

R加入data.table

提问于
浏览
0

我正在尝试连接两个数据框(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

    您需要从左表中选择带有前缀( x. )的 val 列;有关更多信息,请参阅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
    

相关问题