Использование результата суммирования (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