Избегание NA в as.numeric()
Если я это сделал, я получаю правильный результат:
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
Ответы
Ответ 1
Две вещи.
Во-первых, существует разница между символьной строкой "NA"
и представлением R-данных для отсутствующих значений NA
. Удалите кавычки вокруг NA в вашем примере, чтобы увидеть:
a <- c("10","28","3",NA)
Во-вторых, когда вы используете min
с фактическими отсутствующими значениями (т.е. не с символьными строками "NA"
), вы захотите использовать na.rm = TRUE
:
which(as.numeric(a) == min(as.numeric(a),na.rm = TRUE))
Ответ 2
Основная проблема заключается не в определении na.rm = TRUE
в вызове min
numeric_a <- as.numeric(a)
which(numeric_a == min(numeric_a, na.rm = TRUE))
## [1] 3
Или вы можете использовать which.min
, который не требует указания того, что значения NA должны быть удалены. Это даст вам только первое совпадение, не все совпадения (спасибо @Dason, чтобы напомнить мне, чтобы уточнить это)
which.min(numeric_a)