Кадры данных и is.nan()

Я использовал sum(is.na(my.df)), чтобы проверить, содержит ли мой кадр данных какие-либо NA, которые работали так, как я ожидал, но sum(is.nan(my.df)) не работал, как я ожидал.

> my.df <- data.frame(a=c(1, 2, 3), b=c(5, NA, NaN))
> my.df
  a   b
1 1   5
2 2  NA
3 3 NaN
> is.na(my.df)
         a     b
[1,] FALSE FALSE
[2,] FALSE  TRUE
[3,] FALSE  TRUE
> is.nan(my.df)
    a     b 
FALSE FALSE 
> sum(is.na(my.df))
[1] 2
> sum(is.nan(my.df))
[1] 0

Боже мой. Есть ли причина для непоследовательности в поведении? Это из-за отсутствия реализации или намеренно? Что означает значение возврата is.nan(my.df)? Есть ли веская причина не использовать is.nan() для всего кадра данных?

В документации для is.na( ) и is.nan( ) типы аргументов кажутся одинаковыми (хотя они специально не перечисляют кадры данных):

is.na(): объект x R, подлежащий тестированию: методы по умолчанию обрабатывают атомные векторы, списки и парные списки. is.nan(): объект x R, подлежащий тестированию: методы по умолчанию обрабатывают атомные векторы, списки и парные списки.

Ответ 1

От ?is.nan:

All elements of logical,integer and raw vectors are considered not to be NaN, and
elements of lists and pairlists are also unless the element is a length-one numeric
or complex vector whose single element is NaN.

Столбцы кадра данных являются технически "элементами списка", поэтому is.nan(df) возвращает вектор с длиной, равной числу столбцов кадра данных, который равен TRUE, только если столбец состоит из одиночный элемент NaN:

> is.nan(data.frame(a=NaN,b=NA,c=1))
    a     b     c 
 TRUE FALSE FALSE 

Если вы хотите, чтобы поведение соответствовало параметру is.na, используйте apply:

sum(apply(my.df,2,is.nan))

Ответ равен 1, а не 2, потому что is.nan(NA) - FALSE...

изменить: альтернативно, вы можете просто превратить фрейм данных в матрицу:

 sum(is.nan(as.matrix(my.df)))

update: это поведение изменилось в ближайшее время (два месяца) после того, как был задан вопрос, в R версии 2.14 (октябрь 2011): из файл новостей,

o По умолчанию методы is.finite(), is.infinite() и is.nan() теперь сигнализируют об ошибке, если их аргумент не является атомным вектором.