我在R中有两个数据帧。
df1看起来像这样:
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
df2看起来像这样:
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
我正在尝试从df1中选择介于df2中任何start_time和end_time对之间的行。在上面的示例中,我将拥有:
id time
1 2018-08-28 11:22:40
3 2018-08-28 11:50:00
此问题与发现的here类似,但在R中而不是SQL中。我该如何实现?
答案 0 :(得分:1)
这里是使用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
),然后仅选择{{1}中没有NA
的行}(因为它们是start_time
-start_time
间隔内的条目)。
end_time