2010-07-22 6 views
26

Ich habe ein Datum in R, z.B .:Wie subtrahiert man Jahre?

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

Ich mag würde 2 Jahre ab diesem Zeitpunkt subtrahieren, ohne sich Gedanken über Schaltjahre und solche Fragen, immer as.Date('2010-03-17').

Wie würde ich das tun?

Antwort

33

Am einfachsten ist es, es in POSIXlt umzuwandeln und 2 von den Jahren zu subtrahieren.

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

Siehe diese verwandte Frage: How to subtract days in R?.

+0

rcs die Antwort unten ist vorzuziehen - wir haben zu tun 'difftime' Betreiber dafür. –

+2

Mit difftime, glaube ich nicht, dass Sie Jahre, Tage oder Wochen tun können. – gt6989b

+0

Seien Sie vorsichtig im Falle von Feb-29, weil das resultierende Objekt wahrscheinlich wday/mon/mday Slots nicht korrekt haben wird! Versuchen Sie: 'd = as.POSIXlt ('2016-02-29', tz = 'GMT'); d $ Jahr = d $ Jahr - 1 'und überprüfen Sie die Werte von' d $ wday, d $ mon, d $ mday' – digEmAll

21

Sie seq verwenden:

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

es gibt jedoch keine Möglichkeit, dies auf eine Liste von Daten anzuwenden, es sei denn, ich vermisse eine einfache Erweiterung – MichaelChirico

43

Mit lubridate

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

Woher kommt man lubridate? – Farrel

+0

Von CRAN, sobald der CRAN-Betreuer aus seinem Urlaub zurückkehrt. – hadley

+0

Haben Sie Lubridat geschrieben? Ich habe Datum Umgang mit einem der irritierendsten Aspekte von R. gefunden. Also wo bekomme ich lubridate von ohne warten auf jemanden aus dem Urlaub zurückzukehren? – Farrel

2

Gleicher Antwort als die von rcs aber mit der Möglichkeit, es auf einem Vektor zu betreiben (zu MichaelChirico zu beantworten, kann ich ‚t Kommentar ich habe nicht genug 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" 
6

Wenn Schalttag s werden berücksichtigt werden, dann würde ich mit dieser lubridate Funktion empfehlen Monate subtrahieren, da andere Methoden zurück entweder 1. März oder 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

Ob Sie den 28. Februar oder 1. März erhalten, ist eine Frage der Konvention. "NA" ist offensichtlich inakzeptabel, da stimme ich zu. Danke für das Hinzufügen von Informationen. – gt6989b