2013-02-28 12 views
13

Chciałbym wskazać najbliższą datę w wektorze podanej daty. Powiedzmy mam datę następującą wektor (z 5 losowych terminach):Najbliższa data w wektorze do podanej daty

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

Teraz chcę znaleźć najbliższy termin do x = as.Date("2013-10-01") wewnątrz tego wektora.

Oto mój kod:

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

Wynik powinien być 4, ponieważ data "2013-09-12" jest najbliżej. Ale mam 1 ... Co jest nie tak w moim kodzie?

+0

sprawdź 'neardate' w pakiecie przeżycia –

Odpowiedz

14

przegapisz abs zadbać o wartości ujemne:

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

w moim rzeczywistym zimnym wektorze, mam NA. Polecenie zwraca teraz liczbę całkowitą (0). Jak mam sobie radzić z tą NA? – Henri

+2

@Henri - usuń NA z funkcji 'min':' which (abs (coldate-x) == min (abs (coldate-x), na.rm = TRUE)) ' – thelatemail

+0

@ the mailem To działa. Dziękuję Ci. – Henri

5

Zobacz także funkcję which.min:

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

Podczas gdy 'which.min' wydaje się oczywistym wyborem, zaletą odpowiedzi przez @Arun jest to, że zwróci wiele wartości, jeśli istnieje wiele wartości minimalnych. Sposób radzenia sobie z tymi przypadkami może w rzeczywistości stanowić problem przy tworzeniu czystego zbioru danych, ale jest to coś, co należy wziąć pod uwagę. – thelatemail

3

which.closest() funkcji z pakietu birk jest prostym rozwiązaniem.

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