подмножество данных по датам, хранящимся в списке в столбце - PullRequest
0 голосов
/ 29 октября 2018

У меня есть data.frame, в котором список дат хранится в одном столбце, а дата - в другом. Я хочу фильтровать фрейм данных только по датам, когда месяц и день попадают в диапазон месяца и дня.

Например:

set.seed(1)
dat = data.frame(start = seq.Date(today() - 5, today(), 'day'), end = seq.Date(today(), today() + 5, 'day'))
dat1 = dat %>% rowwise() %>% mutate(range = list(seq.Date(start, end, 'day')))
dat1$date = sample(seq(as.Date('1998/10/01'), as.Date('1998/12/01'), by="day"), 6)

и я пытаюсь отфильтровать по

dat1[format(dat1$date, '%m%d') %in% format(dat1$range, '%m%d'), ]

но я получаю ошибку:

Ошибка в prettyNum (.Internal (формат (x, усечение, цифры, nsmall, ширина, 3L,: неверный аргумент 'trim'

Где я ожидал

Source: local data frame [1 x 4]
Groups: <by row>

  # A tibble: 6 x 4
  start      end        range      date      
<date>     <date>     <list>     <date>    
1 2018-10-24 2018-10-29 <date [6]> 1998-10-17 ## as pointed out in comments
                                              ## this is incorrect. It would return an empty data.frame. 

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете вернуться к этому, используя lubridate :: ymd. Обратите внимание, что мне пришлось изменить диапазон, используемый для даты выборки, чтобы на самом деле получить истинный результат.

library(tidyverse)
library(lubridate)

set.seed(1)
data.frame(start = seq.Date(today() - 5, today(), 'day'), 
                 end = seq.Date(today(), today() + 5, 'day')) %>% 
  mutate(date = sample(seq(as.Date('1998/10/15'), as.Date('1998/11/15'), by="day"), 6),
         #using the year from start/end and the month/day from date, is date in the range?
         InRange = ymd(year(start) * 10000 + month(date) * 100 + day(date)) >= start &
                    ymd(year(end) * 10000 + month(date) * 100 + day(date)) <= end) %>% 
  filter(InRange)

   start        end       date      InRange
1 2018-10-25 2018-10-30 1998-10-26    TRUE
...