POSIXct datetimes (~ 10 년의 시간별 데이터) 열이있는 다소 큰 데이터 프레임이 있습니다. 일광 절약 기간에 해당하는 모든 행에 플래그를 지정합니다. 예를 들어 일광 근무 시간이 '2000-04-02 03:00:00'(DOY = 93)에 시작하는 경우 DOY = 93의 이전 두 시간에 플래그를 지정할 수 있기를 바랍니다. 나는 dplyr의 초보자이지만 가능한 한이 패키지를 사용하고 가능한 한 for 루프 를 피할 것 입니다.
예를 들면 :
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
이제 비효율적 인 for-loop를 사용하지 않고 범위 데이터 프레임 에서 위의 결과를 '파이프'합니다 .
@aosmith의 도움으로 문제는 단 두 개의 명령으로 해결할 수 있습니다 (그리고 '솔루션 2'에서와 같이 inner_join을 피함).
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
@beetroot와 @ matthew-plourde의 도움으로 문제가 해결되었습니다. 내부 결합이 누락되었습니다.
limits = span %>% group_by(YEAR) %>% summarise(minDOY=min(DOY[DLS]),maxDOY=max(DOY[DLS])) %>% inner_join(span, by='YEAR')
그런 다음 일광 절약 일에 적합한 값을 채우기 위해 새 열 (CHECK)을 추가했습니다.
limits$CHECK = FALSE
limits$CHECK[(limits$DOY >= limits$minDOY) & (limits$DOY <= limits$maxDOY) ] = TRUE
@beetroot가 주석에서 지적했듯이 조인으로이를 수행 할 수 있습니다.
limits = span %>%
group_by(YEAR) %>%
summarise(minDOY=min(DOY[DLS]),maxDOY=max(DOY[DLS])) %>%
inner_join(span, by='YEAR')
# YEAR minDOY maxDOY date DOY DLS
# 1 2000 93 303 2000-01-01 00:00:00 1 FALSE
# 2 2000 93 303 2000-01-01 01:00:00 1 FALSE
# 3 2000 93 303 2000-01-01 02:00:00 1 FALSE
# 4 2000 93 303 2000-01-01 03:00:00 1 FALSE
# 5 2000 93 303 2000-01-01 04:00:00 1 FALSE
# 6 2000 93 303 2000-01-01 05:00:00 1 FALSE
# 7 2000 93 303 2000-01-01 06:00:00 1 FALSE
# 8 2000 93 303 2000-01-01 07:00:00 1 FALSE
# 9 2000 93 303 2000-01-01 08:00:00 1 FALSE
# 10 2000 93 303 2000-01-01 09:00:00 1 FALSE
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다