Вот, думаю, решение вашего вопроса.
Код должен быть понятным, но вкратце, ключевой частью является создание столбцов даты и времени с интервалами с пакетом lubridate
, а затем использование функции lubridate
*1004* для проверки, является ли данныйвремя находится в заданных интервалах.
Надеюсь, это поможет.
library(tidyverse)
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#>
#> date
db1 <- tribble(~date, ~time, ~lat, ~lon,
"18/04/2017", "6:10", 34.01, -53.07,
"18/04/2017", "6:20", 34.02, -53.09,
"18/04/2017", "6:30", 34.04, -53.10,
"18/04/2017", "6:40", 34.05, -53.11,
"18/04/2017", "6:50", 34.07, -53.13,
"18/04/2017", "7:00", 34.08, -53.14,
"18/04/2017", "7:10", 34.01, -53.07,
"18/04/2017", "7:20", 34.02, -53.09,
"18/04/2017", "7:30", 34.04, -53.10
)
db2 <- tribble(~date, ~start.watch, ~end.watch,
"2017-04-18", "05:00", "06:10",
"2017-04-18", "06:10", "06:30",
"2017-04-18", "06:30", "06:45",
"2017-04-18", "07:20", "08:20")
db2_intervals <- db2 %>%
mutate(end_date = date) %>%
unite("start_datetime", date, start.watch) %>%
unite("end_datetime", end_date, end.watch) %>%
transmute(interval = interval(start = ymd_hm(start_datetime),
end = ymd_hm(end_datetime))) %>%
pull(interval)
db1 %>%
unite("datetime", date, time) %>%
mutate(datetime = lubridate::dmy_hm(datetime)) %>%
filter(datetime %within% as.list(db2_intervals))
#> # A tibble: 6 x 3
#> datetime lat lon
#> <dttm> <dbl> <dbl>
#> 1 2017-04-18 06:10:00 34.0 -53.1
#> 2 2017-04-18 06:20:00 34.0 -53.1
#> 3 2017-04-18 06:30:00 34.0 -53.1
#> 4 2017-04-18 06:40:00 34.0 -53.1
#> 5 2017-04-18 07:20:00 34.0 -53.1
#> 6 2017-04-18 07:30:00 34.0 -53.1
Создано в 2019-10-09 пакетом Представить (v0.3.0)