2012-10-23 25 views
12

Wenn ich das tue, erhalte ich korrektes Ergebnis:Vermeidung NAs in as.numeric()

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

Aber wenn es NAs in dem Vektor, dann gibt es ein Problem

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

Es besteht keine Notwendigkeit für R in den Titel, da haben Sie es als r getaggt – mnel

Antwort

12

Zwei Dinge.

Zunächst gibt es einen Unterschied zwischen der Zeichenkette "NA" und der R-Datendarstellung für fehlende Werte, NA. Entfernen Sie die Anführungszeichen um NA in Ihrem Beispiel zu sehen:

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

Zweitens, wenn Sie min mit tatsächlichen fehlenden Werten sind (also nicht die Zeichenketten "NA") Sie na.rm = TRUE verwenden möchten:

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

Sie sind direkt über das "NA". Es ist ein Tippfehler. Es ist eine NA für fehlende Werte. Danke für Ihre Lösung. – Selvam

+1

Sie können auch 'which.min' verwenden – hadley

8

Ihr Hauptproblem ist die Angabe nicht na.rm = TRUE im Aufruf min

numeric_a <- as.numeric(a) 

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

Oder Sie können die which.min verwenden, die nicht erfordert, dass Sie angeben, dass die NA-Werte entfernt werden sollten. Dies wird Ihnen nur das erste Spiel, nicht alle Spiele (Danke @Dason mich daran erinnert, dies zu klären)

which.min(numeric_a) 
+3

Aber wenn Sie' which.min' verwenden, beachten Sie, dass Sie nur ein einziges Ergebnis erhalten, auch wenn mehrere Werte mit dem Mindestwert übereinstimmen. – Dason

+1

mnel und Dason, danke euch beiden für weitere Illustrationen zur Lösung. – Selvam