A data.table
подход:
library(data.table)
setDT(dataset_A)[, `:=` (disch_date = as.Date(disch_date),
date_join = as.Date(disch_date))]
setDT(dataset_B)[, `:=` (visit_date = as.Date(visit_date),
date_join = as.Date(visit_date))]
dataset_final <- dataset_B[dataset_A, on = .(id, date_join), roll = -30][, date_join := NULL]
Вывод:
id visit_date disch_date
1: 1234 2018-03-17 2018-03-14
2: 1234 2018-03-17 2018-03-17
3: 1234 2018-04-30 2018-04-19
4: 2345 2018-05-12 2018-04-15
5: 2345 <NA> 2018-05-15
6: 3456 2018-05-16 2018-05-16
Вы также можете получить тот же порядок столбцов, что и в ожидаемом результате, выполнив:
dataset_final <- dataset_B[dataset_A,
.(id, disch_date, visit_date),
on = .(id, date_join),
roll = -30]
Вывод:
id disch_date visit_date
1: 1234 2018-03-14 2018-03-17
2: 1234 2018-03-17 2018-03-17
3: 1234 2018-04-19 2018-04-30
4: 2345 2018-04-15 2018-05-12
5: 2345 2018-05-15 <NA>
6: 3456 2018-05-16 2018-05-16