2010-07-22 3 views
26

나는 R의 날짜, 예컨대 : 내가 as.Date('2010-03-17')을 받고, 윤년과 같은 문제에 대한 걱정없이,이 날짜로부터 2 년을 빼기 싶습니다년을 빼는 방법?

dt = as.Date('2010/03/17') 

있습니다.

어떻게하면됩니까?

답변

33

가장 쉬운 방법은 POSIXlt로 변환하고 연도 슬롯에서 2를 빼는 것입니다.

> d <- as.POSIXlt(as.Date('2010/03/17')) 
> d$year <- d$year-2 
> as.Date(d) 
[1] "2008-03-17" 

이 관련 질문보기 : How to subtract days in R?.

+0

이 바람직하다 : 다른 방법은 3 월 1 일 또는 NA 중 하나를 반환으로의가 고려되어야하는 그때, 달을 빼기이 lubridate 기능을 사용하는 것이 좋습니다 것 그것을위한 연산자. –

+2

difftime과 함께, 나는 당신이 몇 년, 며칠 또는 몇 주를 할 수 있다고 생각하지 않습니다. – gt6989b

+0

2 월 29 일의 경우 결과 개체의 wday/mon/mday 슬롯이 올바르지 않을 수 있으므로주의하십시오! 'd = as.POSIXlt ('2016-02-29', tz = 'GMT'); d $ year = d $ year - 1' 그리고'd $ wday, d $ mon, d $ 값을 확인하십시오. mday' – digEmAll

21

당신은 seq 사용할 수 있습니다

R> dt = as.Date('2010/03/17') 
R> seq(dt, length=2, by="-2 years")[2] 
[1] "2008-03-17" 
+1

단순한 확장자가 없다면 날짜 목록에 적용 할 방법이 없습니다 – MichaelChirico

43

lubridate

library(lubridate) 
ymd("2010/03/17") - years(2) 
+0

어디에서 lubridate를 얻을 수 있습니까? – Farrel

+0

CRAN의 관리자가 휴가를 시작하자마자 CRAN에서. – hadley

+0

윤활유를 써 봤어? R의 가장 짜증스러운 부분 중 하나를 다루는 날짜를 찾았습니다. 그래서 누군가 휴가를 기다리지 않고 어디에서 lubridate를 얻을 수 있습니까? – Farrel

2
RCS에 의해서가 아니라 벡터에 그것을 운영 할 수있는 가능성과 함께보다

같은 대답으로 (MichaelChirico에 대답하기 위해, 내가 할 수있는 '코멘트가 없습니다. 충분한 담당자가 없습니다.) :

R> unlist(lapply(c("2015-12-01", "2016-12-01"), 
     function(x) { return(as.character(seq(as.Date(x), length=2, by="-1 years")[2])) })) 
[1] "2014-12-01" "2015-12-01" 
6

윤년 - 우리가 할`difftime` RCS의의 아래 답변

> library(lubridate) 
> dt %m-% months(12*2) 
[1] "2008-03-17" 

# Try with leap day 
> leapdt <- as.Date('2016/02/29') 
> leapdt %m-% months(12*2) 
[1] "2014-02-28" 
+0

2 월 28 일에서 3 월 1 일 사이에 대회가 개최됩니다. 'NA'는 분명히 받아 들일 수 없다고 나는 동의한다. 정보를 추가해 주셔서 감사합니다. – gt6989b