문제
오늘과 가장 가까운 일요일을 찾으려고 합니다.
나는 오늘을 이렇게 정의합니다.
dt <- as.Date("2014-06-04")
다음을 통해 마지막 일요일을 찾을 수 있습니다.
dt - as.POSIXlt(dt)$wday
[1] "2014-06-01"
다음을 통해 다음 일요일을 찾을 수 있습니다.
dt + as.POSIXlt(dt)$wday
[1] "2014-06-07"
다음이 작동하지 않는 이유를 잘 모르겠습니다.
ifelse(as.POSIXlt(dt)$wday <= 3,
dt - as.POSIXlt(dt)$wday,
dt + as.POSIXlt(dt)$wday)
[1] 16222
전화번호를 받고 있습니다: 16222
데이트 대신.
다음 문은 각각 예상대로 작동합니다.
as.POSIXlt(dt)$wday
class(as.POSIXlt(dt)$wday)
as.POSIXlt(dt)$wday <= 3
어떤 아이디어??
해결책
ifelse
가 벡터를 반환하고 날짜에서 "POSIX"클래스를 스트립 한 것으로 나타납니다.
dt + ifelse(as.POSIXlt(dt)$wday <= 3, -1, 1) * as.POSIXlt(dt)$wday
.
대신.
다른 팁
다른 해결책 : e.g를 호출하여 클래스 속성을 복원하십시오.
structure(ifelse(as.POSIXlt(dt)$wday <= 3,
dt - as.POSIXlt(dt)$wday,
dt + as.POSIXlt(dt)$wday), class="Date")
. 여기에서 ifelse
를 사용할 필요가 없습니다. 클래식 if/else
가 작업을 수행합니다.
if(as.POSIXlt(dt)$wday <= 3) dt - as.POSIXlt(dt)$wday else dt + as.POSIXlt(dt)$wday
[1] "2014-06-01"
.
또는 심지어 더 간단합니다 :
wday <- as.POSIXlt(dt)$wday
dt + if(wday<= 3) -wday else wday
. 1) 이 시도:
wday <- as.POSIXlt(dt)$wday
dt + ifelse(wday <= 3, -wday, 7-wday)
이는 다음을 적용합니다. ifelse
일수를 더하거나 뺍니다. ifelse
일반 숫자에는 잘 작동하지만 다음과 같은 복잡한 유형에는 작동하지 않습니다. "Date"
클래스를 사용하면 응용 프로그램을 피할 수 있습니다. ifelse
에게 "Date"
클래스 객체.
만약에 참고하세요 wday > 3
그럼 우리는 추가하고 싶습니다 7-wday
그리고는 아니다 wday
(질문에서와 같이).
여기의 솔루션은 다음과 같은 경우에도 계속 작동합니다. dt
날짜로 구성된 벡터입니다.
2) (1)의 답의 두 번째 줄은 먼저 마지막 일요일을 계산하는 다음과 같은 방식으로 작성할 수 있습니다(dt-wday
) 그 주의 지난 수요일인 경우 다음 일요일을 얻으려면 7을 더합니다.
dt - wday + ifelse(wday > 3, 7, 0)
3) 이를 표현하는 또 다른 방법은 다음과 같습니다.
dt - wday + 7 * (wday > 3)