Вот воспроизводимый пример:
library(data.table)
tbl1 <- data.table(value=seq(5, 30, 5), task=letters[1:6])
tbl2 <- data.table(value=c(4, 6, 8, 12, 16, 18, 22, 27),
date=c(3, 5, 8, 9, 11, 18, 20, 19))
tbl1
## value task
## 1: 5 a
## 2: 10 b
## 3: 15 c
## 4: 20 d
## 5: 25 e
## 6: 30 f
tbl2
## value date
## 1: 4 3
## 2: 6 5
## 3: 8 8
## 4: 12 9
## 5: 16 11
## 6: 18 18
## 7: 22 20
## 8: 27 19
Вместо того, чтобы использовать цикл (в этом нет ничего плохого), этот ответ использует «скользящее соединение», чтобы найти value
из tbl2
это больше, чем значение из tbl1
, и возвращает соответствующие date
и task
:
res <- tbl2[tbl1, on="value", roll=-Inf]
## res
## value date task
## 1: 5 5 a
## 2: 10 9 b
## 3: 15 11 c
## 4: 20 20 d
## 5: 25 19 e
## 6: 30 NA f
Для объяснения подвижных объединений с примерами см. это сообщение в блогеот Бена Гормана .