在R范围内选择时间戳

时间:2018-09-11 23:57:10

标签: r time

我在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中。我该如何实现?

1 个答案:

答案 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

说明:间隔连接df1df2(其中time >= start_timetime <= end_time),然后仅选择{{1}中没有NA的行}(因为它们是start_time-start_time间隔内的条目)。


样本数据

end_time