Использование результата суммирования (dplyr) для изменения исходного кадра данных

У меня довольно большой фрейм данных с колонкой POSIXct datetimes (~ 10 лет почасовых данных). Я бы отмечал все строки, в которых день попадает в период перехода на летнее время. Например, если переход на летнее время начинается с «2000-04-02 03:00:00» (DOY = 93), я бы хотел, чтобы два предыдущих часа DOY = 93 можно было пометить. Хотя я новичок в dplyr, я бы использовал этот пакет как можно больше и избегалдля-петли как можно больше

Например:

library(lubridate)
sd = ymd('2000-01-01',tz="America/Denver")
ed = ymd('2005-12-31',tz="America/Denver")
span = data.frame(date=seq(from=sd,to=ed, by="hour"))
span$YEAR = year(span$date)
span$DOY = yday(span$date)
span$DLS = dst(span$date)

Чтобы найти разные дни года, в котором применяется летнее время, я использую dplyr

library(dplyr)
limits = span %.% group_by(YEAR) %.% summarise(minDOY=min(DOY[DLS]),maxDOY=max(DOY[DLS]))

Что дает

      YEAR minDOY maxDOY
    1 2000     93    303
    2 2001     91    301
    3 2002     97    300
    4 2003     96    299
    5 2004     95    305
    6 2005     93    303

Теперь я бы "труба" вышеупомянутые результаты впролет кадр данных без использования неэффективногодля цикла.

РЕШЕНИЕ 1

с помощью @aosmith проблему можно решить всего двумя командами (и избегая inner_join, как в «решении 2»):

 limits = span %>% group_by(YEAR) %>% mutate(minDOY=min(DOY[DLS]),maxDOY=max(DOY[DLS]),CHECK=FALSE)

 limits$CHECK[(limits2$DOY >= limits$minDOY) & (limits$DOY <= limits$maxDOY) ] = TRUE      
РЕШЕНИЕ 2

С помощью @beetroot и @ matthew-plourde проблема была решена: отсутствует внутреннее соединение:

limits = span %>% group_by(YEAR) %>% summarise(minDOY=min(DOY[DLS]),maxDOY=max(DOY[DLS])) %>% inner_join(span, by='YEAR')

Затем я просто добавил новый столбец (ПРОВЕРКА), чтобы заполнить его правильными значениями для летнего времени.

limits$CHECK = FALSE
limits$CHECK[(limits$DOY >= limits$minDOY) & (limits$DOY <= limits$maxDOY) ] = TRUE

Ответы на вопрос(3)

Ваш ответ на вопрос