web-dev-qa-db-fra.com

Comment soustraire des années?

J'ai une date en R, par exemple:

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

Je voudrais soustraire 2 ans de cette date, sans se soucier des années bissextiles et de ces problèmes, en obtenant as.Date('2010-03-17').

Comment ferais-je ça?

41
gt6989b

La chose la plus simple à faire est de le convertir en POSIXlt et de soustraire 2 de la tranche d'années.

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

Voir cette question connexe: Comment soustraire des jours dans R? .

47
Shane

Avec lubridate

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

Vous pouvez utiliser seq:

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

Si les jours bissextiles doivent être pris en compte, je recommanderais d'utiliser cette fonction de lubrification pour soustraire les mois, car d'autres méthodes reviendront soit le 1er mars, soit NA:

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

Même réponse que celle de rcs mais avec la possibilité de l'opérer sur un vecteur (pour répondre à MichaelChirico, je ne peux pas commenter je n'ai pas assez de 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"
3