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>
我确定这是一个愚蠢的问题...但我环顾四周,似乎找不到任何东西。
假设我有两个表:
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>