Hoe jaren aftrekken?

Ik heb een datum in R, bijvoorbeeld:

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

Ik wil graag 2 jaar van deze datum aftrekken, zonder me zorgen te maken over schrikkeljaren en dergelijke, en krijg as.Date('2010-03-17').

Hoe zou ik dat doen?


Antwoord 1, autoriteit 100%

Met lubridate

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

Antwoord 2, autoriteit 58%

Het gemakkelijkste is om het om te zetten in POSIXlt en 2 af te trekken van het jaartal.

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

Zie deze gerelateerde vraag: Hoe dagen aftrekken in R?.


Antwoord 3, autoriteit 31%

Je zou seqkunnen gebruiken:

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

Antwoord 4, autoriteit 11%

Als er rekening moet worden gehouden met schrikkeldagen, raad ik aan om deze smeerfunctie te gebruiken om maanden af ​​te trekken, aangezien andere methoden ofwel 1 maart ofwel NA zullen terugkeren:

> 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"

Antwoord 5, autoriteit 3%

Hetzelfde antwoord als dat van rcs, maar met de mogelijkheid om het op een vector te laten werken (om MichaelChirico te antwoorden, ik kan geen commentaar geven, ik heb niet genoeg rep):

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"

Antwoord 6, autoriteit 2%

Op deze manier lijkt het ook goed te werken

dt = as.Date("2010/03/17")
dt-365*2
[1] "2008-03-17"
as.Date("2008/02/29")-365*2
## [1] "2006-03-01"

Other episodes