2010-07-22 5 views
26

J'ai une date dans R, .: par exempleComment soustraire des années?

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

Je voudrais soustraire 2 ans à compter de cette date, sans se soucier des années bissextiles et ces questions, obtenir as.Date('2010-03-17').

Comment est-ce que je ferais cela?

Répondre

33

La chose la plus simple à faire est de le convertir en POSIXlt et de soustraire 2 du slot ans.

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

Voir cette question connexe: How to subtract days in R?.

+0

rcs de réponse ci-dessous est préférable - nous avons 'difftime' opérateur pour cela. –

+2

Avec difftime, je ne pense pas que vous pouvez faire des années, juste des jours ou des semaines. – gt6989b

+0

Soyez prudent dans le cas de Feb-29, car l'objet résultant aura probablement des fentes wday/mon/mday incorrectes! Essayez: 'd = as.POSIXlt ('2016-02-29', tz = 'GMT'); d $ année = d $ année - 1' et vérifiez les valeurs de' d $ wday, d $ mon, d $ mday' – digEmAll

21

Vous pouvez utiliser seq:

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

il n'y a aucun moyen d'appliquer cela à une liste de dates, cependant, à moins que je ne manque une extension simple – MichaelChirico

43

Avec lubridate

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

D'où vient-on lubrifier? – Farrel

+0

De CRAN, dès que le mainteneur CRAN reviendra de ses vacances. – hadley

+0

Avez-vous écrit lubridate? J'ai trouvé que la manipulation de la date est l'un des aspects les plus irritants de R. Alors, où puis-je me lubrifier sans attendre que quelqu'un revienne de vacances? – Farrel

2

Même réponse que celle par rcs mais avec la possibilité de le faire fonctionner sur un vecteur (pour répondre à MichaelChirico, je peux Je ne peux pas commenter suffisamment):

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

Si bissextile s sont à prendre en compte alors je vous recommande d'utiliser cette fonction lubridate à soustraire mois, que d'autres méthodes retourneront soit 1er Mars ou 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" 
+0

Que vous soyez le 28 février ou le 1er mars est une question de convention. "NA" est évidemment inacceptable, je suis d'accord. Merci d'avoir ajouté des informations. – gt6989b