R data.table 加入包含 "from" 和 "to" row_id 的 table

R data.table join to table containing "from" & "to" row_id's

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

假设我有两个表:

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 变成一个长的排序形式然后加入,但我真正需要的是在开始和之间生成序列在加入之前结束行。欢迎提出任何建议!

我们只需要一个非相等连接

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>

您可以使用 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>