2012-10-23 11 views
12

Gdybym to zrobił, otrzymuję poprawny wynik:Unikanie agencjom krajowym w as.numeric()

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

Ale jeśli nie ma agencjom krajowym w wektorze, to nie jest 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

Nie ma potrzeby badania w tytule, biorąc pod uwagę, że masz to oznaczone jako R – mnel

Odpowiedz

12

Two rzeczy.

Po pierwsze, występuje różnica między ciągiem znaków "NA" a reprezentacją danych R dla brakujących wartości, NA. Usunąć cudzysłowy wokół NA w swoim przykładzie zobaczyć:

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

drugie, gdy używasz min z rzeczywistych brakujących wartości (czyli nie jest ciągi znaków "NA") będziemy chcieli użyć na.rm = TRUE:

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

Jesteś dokładnie o wskazaniu "NA". To literówka. Ma to być NA dla brakujących wartości. Dziękuję za rozwiązanie. – Selvam

+1

Możesz również użyć 'which.min' – hadley

8

Twoim głównym problemem nie jest określeniem na.rm = TRUE w ramach wezwania do min

numeric_a <- as.numeric(a) 

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

Można również użyć parametru which.min, który nie wymaga określenia, że ​​wartości NA powinny zostać usunięte. To tylko daje pierwszy mecz, nie wszystkie mecze (dzięki @Dason za przypomnienie mi to wyjaśnić)

which.min(numeric_a) 
+3

Ale jeśli użyjesz' which.min', zauważ, że otrzymasz tylko jeden wynik, nawet jeśli istnieje wiele wartości, które pasują do minimalnej wartości. – Dason

+1

mnel i Dason, dziękuję wam obu za dalsze ilustracje na temat rozwiązania. – Selvam