web-dev-qa-db-ja.com

as.numeric()でのNAの回避

これを行った場合、正しい結果が得られます。

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

しかし、ベクトルにNAがある場合、問題があります。

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
13
Selvam

2つのこと。

まず、文字列"NA"と、欠損値のNAのRデータ表現には違いがあります。例を見るには、NAの前後の引用符を削除してください。

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

次に、minactual欠損値(つまり、文字列"NA"ではない)で使用している場合は、na.rm = TRUEを使用する必要があります。

which(as.numeric(a) == min(as.numeric(a),na.rm = TRUE))
13
joran

主な問題は、minの呼び出し内でna.rm = TRUEを指定していないことです

numeric_a <- as.numeric(a)

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

または、NA値を削除するように指定する必要のないwhich.minを使用できます。これにより、すべての一致ではなく、最初の一致のみが提供されます(これを明確にするように通知してくれた@Dasonに感謝)

which.min(numeric_a)
8
mnel