NaN удаляется при использовании na.rm=TRUE

Этот воспроизводимый пример представляет собой очень упрощенную версию моего кода:

x <- c(NaN, 2, 3)

#This is fine, as expected
max(x)
> NaN

#Why does na.rm remove NaN?
max(x, na.rm=TRUE) 
> 3

Для меня NA (отсутствующее значение) и NaN (не число) — это две совершенно разные сущности, почему na.rm удаляет NaN? Как я могу игнорировать NA, а не NaN?

ps: я использую 64-битную версию R 3.0.0 в Windows7.

Редактировать: после дальнейшего изучения я обнаружил, что is.na возвращает true и для NaN! Это является причиной путаницы для меня.

is.na(NaN)
> TRUE

person Nishanth    schedule 16.04.2013    source источник


Ответы (2)


Это языковое решение:

> is.na(NaN)
[1] TRUE

is.nan различает:

> is.nan(NaN)
[1] TRUE
> is.nan(NA)
[1] FALSE

Так что, возможно, вам придется позвонить обоим.

person Matthew Lundberg    schedule 16.04.2013
comment
Да, я только что заметил это поведение. Мое представление об отсутствующей ценности должно измениться. - person Nishanth; 16.04.2013
comment
@ e4e5f4 Я, вероятно, не выбрал бы такое поведение, если бы я разрабатывал язык. Но что есть, то есть. - person Matthew Lundberg; 16.04.2013
comment
Интересно отметить, что в справке для sum указано, что na.rm = TRUE удалит как NaN, так и NA (в то время как ?Extremes) нет. - person mnel; 16.04.2013
comment
Также интересно: класс (NA) == логический; класс (NaN) == числовой. - person neilfws; 16.04.2013
comment
@neilfws Это удобство и другое языковое решение. Попробуйте class(NA_real_). - person Matthew Lundberg; 16.04.2013

Аргументы na.rm в функциях обычно используют is.na() или аналогичную функцию.
И, начиная с is.na(NaN) == TRUE, вы получаете то поведение, которое наблюдаете.

Теперь должен ли NaN рассматриваться как NA? Это другой вопрос ;)


Лучший способ обойти это — явно указать R, как обращаться с NaN Один пример:

ifelse(any(is.nan(x)), NaN, min(x, na.rm=TRUE))
person Ricardo Saporta    schedule 16.04.2013