Подтвердить что ты не робот

Избегание 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
4b9b3361

Ответ 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)