Фреймы данных и is.nan () - PullRequest
       5

Фреймы данных и is.nan ()

19 голосов
/ 11 августа 2011

Я использовал 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 объект, который будет проверен: методы по умолчанию обрабатывают атомарные векторы, списки и парлисты.

Ответы [ 2 ]

20 голосов
/ 11 августа 2011

С ?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 () теперь сигнализируют об ошибке, если их аргумент не является атомным вектором.

1 голос
/ 21 сентября 2018

Функция is.nan не работает со списками по какой-то странной причине.Почему он отличается от is.na, мне не понятно и, похоже, это проблема языкового дизайна.Однако есть простое решение:

df <- data.frame(a=c(1, 2, 3), b=c(5, NA, NaN)) 
df <- data.frame(sapply(df, function(x) ifelse(is.nan(x), NA, x)))
df
  a  b
1 1  5
2 2 NA
3 3 NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...