【问题标题】:R data.table join to table containing "from" & "to" row_id'sR data.table 连接到包含“from”和“to”row_id 的表
【发布时间】:2021-11-28 17:52:21
【问题描述】:

我确定这是一个愚蠢的问题......但我环顾四周,似乎找不到任何东西。

假设我有两张桌子:

a <- data.table(row_id = 1:12)
b <- data.table(start_row = c(1,5,10),end_row = c(3,7,11),value = c("a","b","c"))
> a
    row_id
 1:      1
 2:      2
 3:      3
 4:      4
 5:      5
 6:      6
 7:      7
 8:      8
 9:      9
10:     10
11:     11
12:     12
> b
   start_row end_row value
1:         1       3     a
2:         5       7     b
3:        10      11     c

我想加入使用来自b 的行索引,将value 插入a,以生成如下内容:

> c
    row_id value
 1:      1     a
 2:      2     a
 3:      3     a
 4:      4  <NA>
 5:      5     b
 6:      6     b
 7:      7     b
 8:      8  <NA>
 9:      9  <NA>
10:     10     c
11:     11     c
12:     12  <NA>

我现在正在做的是使用 for 循环,这很慢:

for (i in 1:nrow(s)) {
    a[row_id >= b[i,start_row] & row_id <= b[i,end_row],value := b[i,value]]
}

我考虑过 dcasting b 进入一个长形式的排序然后加入,但我真正需要的是在加入之前生成开始行和结束行之间的序列。欢迎提出任何建议!

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以使用fuzzyjoin 连接这两个表。

    library(dplyr)
    
    fuzzyjoin::fuzzy_left_join(a, b, 
               by = c('row_id' = 'start_row', 'row_id' = 'end_row'), 
               match_fun = c(`>=`, `<=`)) %>%
      select(row_id, value)
    
    #   row_id value
    #1       1     a
    #2       2     a
    #3       3     a
    #4       4  <NA>
    #5       5     b
    #6       6     b
    #7       7     b
    #8       8  <NA>
    #9       9  <NA>
    #10     10     c
    #11     11     c
    #12     12  <NA>
    

    【讨论】:

      【解决方案2】:

      我们只需要一个非 equi 连接

      library(data.table)
      a[b, value := i.value, on = .(row_id >= start_row, row_id <= end_row)]
      

      -输出

      > a
          row_id value
       1:      1     a
       2:      2     a
       3:      3     a
       4:      4  <NA>
       5:      5     b
       6:      6     b
       7:      7     b
       8:      8  <NA>
       9:      9  <NA>
      10:     10     c
      11:     11     c
      12:     12  <NA>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-09
        • 2015-04-29
        • 2016-08-01
        • 2021-11-09
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 2016-08-28
        相关资源
        最近更新 更多