2013-02-28 24 views
13

Vorrei identificare la data più vicina in un vettore di una determinata data. Diciamo che ho il seguente data di vettore (con 5 date casuali):Data più vicina in un vettore a una data data

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

Ora, voglio trovare la data più vicina alla x = as.Date("2013-10-01") all'interno di questo vettore.

Ecco il mio codice:

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

Il risultato dovrebbe essere 4, dal momento che la data di "2013-09-12" è il più vicino. Ma, ho 1 ... Cosa c'è che non va nel mio codice?

+0

controllare 'neardate' nel pacchetto di sopravvivenza –

risposta

14

manchi un abs di prendersi cura di valori negativi:

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

nel mio vettore coldate effettivo, ho un NA. Il comando ora sta restituendo un intero (0). Come devo avere a che fare con questo NA? – Henri

+2

@Henri - rimuove le NA dalla funzione 'min':' quale (abs (coldate-x) == min (abs (coldate-x), na.rm = TRUE)) ' – thelatemail

+0

@thelatemail Funziona. grazie. – Henri

5

Vedi anche la funzione which.min:

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

Mentre 'which.min' sembra la scelta più ovvia, il vantaggio della risposta di @Arun è che restituirà più valori se ci sono più valori minimi. Il modo in cui gestisci questi casi potrebbe effettivamente essere un problema nel creare un set di dati pulito, ma è qualcosa che dovrebbe essere considerato. – thelatemail

3

La funzione which.closest() dal pacchetto birk è una semplice opzione.

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 
Problemi correlati