Выбор временных меток в диапазоне в R - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть два кадра данных в 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, которые попадают между любой из пар start_time и end_time в df2. В приведенном выше примере это оставило бы меня с:

id       time
1        2018-08-28 11:22:40
3        2018-08-28 11:50:00

Эта проблема аналогична найденной здесь , но в R вместо SQL. Как мне этого добиться?

1 Ответ

0 голосов
/ 12 сентября 2018

Вот вариант, использующий 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...