Вот вариант, использующий fuzzyjoin
library(fuzzyjoin)
library(tidyverse)
fuzzy_left_join(
df1 %>% mutate(time = as.POSIXct(time)),
df2 %>% mutate(
start_time = as.POSIXct(start_time),
end_time = as.POSIXct(end_time)),
by = c("time" = "start_time", "time" = "end_time"),
match_fun = list(`>=`, `<=`)) %>%
filter(!is.na(start_time)) %>%
select(id, time)
# id time
#1 1 2018-08-28 11:22:40
#2 3 2018-08-28 11:50:00
Объяснение: Интервальное объединение df1
и df2
(где time >= start_time
& time <= end_time
), затем выбираются только строки без NA
s в start_time
(поскольку это записи, которые находятся в интервале start_time
- end_time
).
Пример данных
df1 <- read.table(text =
"id time
1 '2018-08-28 11:22:40'
2 '2018-08-28 11:35:10'
3 '2018-08-28 11:50:00'
4 '2018-08-28 11:55:30'", header = T)
df2 <- read.table(text =
"start_time end_time
'2018-08-28 11:22:00' '2018-08-28 11:22:50'
'2018-08-28 11:30:30' '2018-08-28 11:34:10'
'2018-08-28 11:49:00' '2018-08-28 11:52:20'
'2018-08-28 11:57:20' '2018-08-28 11:59:40'", header = T)