Вот вариант, использующий неэквивалентное объединение в data.table
:
procedures[, type_service :=
frequencies[procedures, on=.(id_person, date_hour_initial<=date_hour, date_hour_final>=date_hour),
by=.EACHI, if (length(x.type_service) == 1L) x.type_service]$V1
]
вывод:
id date_hour id_person type_service
1: 1 2020-01-01 17:00:00 1 1
2: 2 2020-01-01 22:00:00 1 <NA>
3: 3 2020-01-03 03:00:00 2 4
data:
library(data.table)
frequencies <- data.table(id = 1:3,
date_hour_initial = as.POSIXct(c('01/01/2020 13:00:00','01/01/2020 15:00:00','02/01/2020 20:00:00'), format="%d/%m/%Y %T"),
date_hour_final= as.POSIXct(c('01/01/2020 18:00:00','01/01/2020 22:00:00','03/01/2020 05:00:00'), format="%d/%m/%Y %T"),
id_person = c("1", "2", "2"),
type_service = c("1", "3", "4"))
procedures <- data.table(id = 1:3,
date_hour = as.POSIXct(c('01/01/2020 17:00:00','01/01/2020 22:00:00','03/01/2020 03:00:00'), format="%d/%m/%Y %T"),
id_person = c("1", "1", "2"))
Мои предположения это займет около минуты для 4 миллионов строк?