您可以使用fuzzy_inner_join 获取范围内的行。我们将时间值转换为 POSIXct 类型,以便我们可以比较时间。
library(dplyr)
library(fuzzyjoin)
df1 %>%
mutate(TIME = as.POSIXct(TIME, format = '%T', tz = 'UTC')) %>%
fuzzy_inner_join(df2 %>%
mutate(across(c(START.TIME, END.TIME),
as.POSIXct, format = '%T', tz = 'UTC')),
by = c('TIME' = 'START.TIME', 'TIME' = 'END.TIME'),
match_fun = c(`>=`, `<=`)) %>%
select(ID = ID.x, everything(), -ID.y) %>%
mutate(across(ends_with('TIME'), format, '%T'))
# ID TIME SPECIES START.TIME END.TIME
#1 1 22:45:43 sp1 22:00:00 23:00:00
#2 2 22:46:22 sp2 22:00:00 23:00:00
#3 5 00:11:37 sp2 00:00:00 01:00:00
数据
df1 <- structure(list(ID = 1:7, TIME = c("22:45:43", "22:46:22", "23:21:11",
"23:32:31", "00:11:37", "01:48:56", "02:36:22"), SPECIES = c("sp1",
"sp2", "sp3", "sp1", "sp2", "sp4", "sp1")), row.names = c(NA,
-7L), class = "data.frame")
df2 <- structure(list(ID = 1:2, START.TIME = c("22:00:00", "00:00:00"
), END.TIME = c("23:00:00", "01:00:00")), row.names = c(NA, -2L
), class = "data.frame")