Если дата между двумя датами во второй таблице возвращает значение

Bill Perry спросил: 14 ноября 2017 в 07:05 в: r

Я пытаюсь определить, находится ли дата-время между начальной и конечной датами, а также возвращает ли значение, соответствующее этому. Он работает в data.table, но хочет, чтобы он работал в DPLYR.

Поэтому, если у вас есть datetime:

2017-07-01 02:15:00 
2017-07-01 02:30:00

найдите их во второй таблице

begin,      end,                           value1,  value2
2017-07-01 00:01:00,  2017-07-01 01:00:00,  1,       2
2017-07-01 01:01:00,  2017-07-01 02:00:00,  3,       4
2017-07-01 02:01:00,  2017-07-01 03:00:00,  5,       6

return

date                value1   value2
2017-07-01 02:15:00    5        6     
2017-07-01 02:30:00    5        6  

Существует много значений поиска, поэтому было бы несколько сотен раз поиска даты.

Я работаю с data.table, но хочу использовать DPLYR, чтобы уменьшить зависимость от многих пакетов. Это то, что у меня есть до сих пор:

library(tidyverse)
library(lubridate)
library(data.table)dates <- read_csv("date1.csv") %>% 
  mutate(date = as_datetime(date))lookup <- read_csv("lookup.csv") %>% 
  mutate(begin = as_datetime(begin),
         end = as_datetime(end))dates <- data.table(dates)
lookup <- data.table(lookup)
setkey(lookup, begin, end)
dates[, c("begin", "end") := date]  
test.df <- foverlaps(dates, lookup)[, c("date", "value1", "value2"), 
                                        with = FALSE] 

я думал об использовании чего-то вроде:

test <- dates %>% rowwise() %>%
  mutate(value1 = ifelse( lookup$begin >= date & date <= lookup$end, lookup$value1, ""))

Вот даты, чтобы посмотреть up:

    dates <- structure(list(date = structure(c(1498867200, 1498868100, 1498869000, 
1498869900, 1498870800, 1498871700, 1498872600, 1498873500, 1498874400, 
1498875300, 1498876200, 1498877100, 1498878000, 1498878900, 1498879800, 
1498880700, 1498881600, 1498882500), tzone = "UTC", class = c("POSIXct", 
"POSIXt"))), .Names = "date", class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -18L))

Таблица поиска:

    lookup <- structure(list(begin = structure(c(1498867260, 1498870860, 1498874460, 
1498878060, 1498881660, 1498885260, 1498888860, 1498892460, 1498896060
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), end = structure(c(1498870800, 
1498874400, 1498878000, 1498881600, 1498885200, 1498888800, 1498892400, 
1498896000, 1498899600), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    value1 = c(1L, 3L, 5L, 7L, 9L, 11L, 13L, 15L, 17L), value2 = c(2L, 
    4L, 6L, 8L, 10L, 12L, 14L, 16L, 18L)), .Names = c("begin", 
"end", "value1", "value2"), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -9L))

0 ответов