С ?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
...
edit : альтернативно, вы можете просто превратить фрейм данных в матрицу:
sum(is.nan(as.matrix(my.df)))
обновление : это поведение изменилось вскоре (через два месяца) после того, как вопрос был задан, в версии R 2.14 (октябрь 2011 г.): из файла NEWS ,
o Методы по умолчанию для is.finite (), is.infinite () и is.nan () теперь сигнализируют об ошибке, если их аргумент не является атомным вектором.