2012-10-23 10 views
12

Se ho fatto questo, ho ottenere il risultato corretto:Evitare AN in as.numeric()

a <- c("10","28","3") 
which(as.numeric(a) == min(as.numeric(a))) 
[1] 3 

Ma se c'è AN nel vettore, allora c'è un problema

a <- c("10","28","3","NA") 
which(as.numeric(a) == min(as.numeric(a))) 
integer(0) 
Warning messages: 
1: In which(as.numeric(a) == min(as.numeric(a))) : 
    NAs introduced by coercion 
2: In which(as.numeric(a) == min(as.numeric(a))) : 
    NAs introduced by coercion 
+0

Non v'è alcuna necessità di R nel titolo, visto che lo avete etichettato come r – mnel

risposta

12

Two cose.

Innanzitutto, c'è una differenza tra la stringa di caratteri "NA" e la rappresentazione dei dati R per i valori mancanti, NA. Rimuovere le virgolette intorno NA nel tuo esempio per vedere:

a <- c("10","28","3",NA) 

In secondo luogo, quando si utilizza min con effettivi valori mancanti (ovvero non le stringhe di caratteri "NA") si vorrà utilizzare na.rm = TRUE:

which(as.numeric(a) == min(as.numeric(a),na.rm = TRUE)) 
+0

Sei giusto per indicare "NA". È un errore di battitura. È pensato per essere un NA per i valori mancanti. Grazie per la soluzione. – Selvam

+1

Si potrebbe anche voler usare 'which.min' – hadley

8

il tuo problema principale non è specificando na.rm = TRUE all'interno della chiamata a min

numeric_a <- as.numeric(a) 

which(numeric_a == min(numeric_a, na.rm = TRUE)) 
## [1] 3 

Oppure è possibile utilizzare which.min che non richiede di specificare che i valori di NA devono essere rimossi. Questo solo vi darà la prima partita, non tutte le partite (Grazie per avermi ricordato @Dason a chiarire questo)

which.min(numeric_a) 
+3

Ma se si usa' which.min' si noti che si otterrà un risultato singolo anche se ci sono più valori che corrispondono al valore minimo. – Dason

+1

mnel e Dason, grazie a tutti e due per ulteriori illustrazioni sulla soluzione. – Selvam