Я уверен, что это глупый вопрос ... но я огляделся и, похоже, ничего не нашел.

Скажем, у меня есть две таблицы:

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]]
}

Я думал о преобразовании b в длинную форму сортировки с последующим объединением, но мне действительно нужно каким-то образом сгенерировать последовательности между начальной и конечной строками перед объединением. Любые предложения приветствуются!

2
shwan 8 Окт 2021 в 23:38

2 ответа

Лучший ответ

Нам просто нужно неэквивалентное соединение

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>
3
akrun 8 Окт 2021 в 20:40

Вы можете присоединиться к двум столам, используя 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>
0
Ronak Shah 9 Окт 2021 в 04:14