2013-02-28 13 views
13

Ich möchte das nächste Datum in einem Vektor eines bestimmten Datums identifizieren. Sagen wir, ich folgendes Datum Vektor haben (mit 5 Zufallsdaten):Nächstes Datum in einem Vektor zu einem bestimmten Datum

coldate= as.Date(c("2013-08-03", "2013-09-04", "2013-09-08", "2013-09-12", "2013-11-01")); 

Nun, ich das nächste Datum zu x = as.Date("2013-10-01") innerhalb dieses Vektors finden möchten.

Hier ist mein Code:

> which((coldate-x) == min(coldate-x)) 
    [1] 1 

Das Ergebnis sollte 4 sein, da das Datum "2013-09-12" in der Nähe ist. Aber, ich habe 1 ... Was ist falsch in meinem Code?

+0

Überprüfen Sie 'Neardate' in der Überlebenspaket –

Antwort

14

Sie vermissen ein abs zu kümmern negative Werte:

which(abs(coldate-x) == min(abs(coldate - x))) 
[1] 4 
+0

in meinem tatsächlichen coldate Vektor, ich habe eine NA. Der Befehl gibt jetzt Ganzzahl (0) zurück. Wie muss ich mit dieser NA umgehen? – Henri

+2

@Henri - entfernen Sie die NA's von der 'min' Funktion:' was (abs (coldate-x) == min (abs (coldate-x), na.rm = WAHR)) ' – thelatemail

+0

@thelatemail Es funktioniert. Danke. – Henri

5

Siehe auch die which.min Funktion:

R> which.min(abs(x-coldate)) 
[1] 4 
+0

Während 'which.min' scheinbar die offensichtliche Wahl ist, hat die Antwort von @Arun den Vorteil, dass sie mehrere Werte zurückgibt, wenn mehrere Mindestwerte vorhanden sind. Wie Sie mit diesen Fällen umgehen, ist möglicherweise ein Problem bei der Erstellung eines sauberen Datensatzes, sollte jedoch berücksichtigt werden. – thelatemail

3

Die which.closest() Funktion aus dem birk Paket ist eine einfache Option.

coldate= as.Date(c("2013-08-03", "2013-09-04", "2013-09-08", "2013-09-12", "2013-11-01")) 
x = as.Date("2013-10-01") 

which.closest(coldate, x) 
[1] 4