Неожиданный результат для is.finite () для фреймов данных в R - PullRequest
3 голосов
/ 12 октября 2011

Я использовал is.finite() для векторов, матриц и т. Д., И это хорошо работает.Что меня озадачивает, так это то, почему он возвращает FALSE для фреймов данных и списков.

Например, следующий пример:

m <- matrix(0, 3, 3)
d <- as.data.frame(m)

is.finite(m)
     [,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

is.finite(d)
   V1    V2    V3 
FALSE FALSE FALSE 

Естественно, он имеет то же самоеповедение для списков.

Я могу понять, если функция не работает для определенного типа объекта (например, фреймы данных).За исключением тривиального случая («остановленные часы правы два раза в день» -> матрица с неконечными значениями), я не вижу случая, когда is.finite() должен возвращать что-либо значимое для фрейма данных или списка,Я ожидал бы ошибку вместо FALSE, иначе ожидал бы, что она принудит вводить, скажем, матрицу, перед применением функции.

Вопрос: есть ли какой-то способ осмысленно использовать is.finite() с фреймами данных (и списками), или есть что-то в его поведении, для которого имеет смысл возвращать FALSE, чемошибка?


Примечание 1: Кстати, это есть в документации:

 All elements of types other than logical, integer, numeric and complex vectors
 are false.  Complex numbers are finite if both the real and imaginary parts are.

Итак, проясним вопрос: зачем возвращать false, а не ошибку?В результате необходимо добавить проверку типа вне вызова к is.finite().

Примечание 2. Просто для рассмотрения случая использования: я рассматривал возможность использования is.na(), is.nan() и is.infinite() для проверки некоторых числовых аномалий и решил, что is.finite() справится, пока я не понял, что он не ведет себя так же, как для кадров данных, как is.na().Это несоответствие было неожиданным.


Обновление (2011-11-01): R 2.14.0 был выпущен и его файл NEWS сообщает: The default methods for is.finite(), is.infinite() and is.nan() now signal an error if their argument is not an atomic vector. Спасибо, боги R-Core!(NB: Kohske ранее сообщал, что это будет иметь место, как указано в версии для разработки. Новость заключается в том, что теперь именно это - это сейчас версия выпуска.)

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Вы передаете вектор списка в функцию, которая документирована для получения ожидаемых результатов с векторами логических, целочисленных, числовых и сложных элементов и для возврата FALSE с чем-либо еще.Вы должны сделать что-то вроде этого:

> sapply( d, is.finite)
       V1   V2   V3
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

(Кстати: данные - это просто списки с дополнительными атрибутами.)

Может быть полезно сравнить результаты с поведением is.nanis.nan, и is.finite являются поэлементными функциями.Также посмотрите, как тесты для режима (это не то, что is.finite или is.nan test) предлагают.Они дают результаты по списку для is.character, is.numeric и is.logical.

> sapply(d, is.character)
   V1    V2    V3 
FALSE FALSE FALSE 
1 голос
/ 12 октября 2011

Я действительно не знаю, почему это не вернет ошибку.К сожалению, is.finite(as.numeric(d)) возвращает ошибку (Error: (list) object cannot be coerced to type 'double').Итак, единственное, что приходит мне в голову, - это перебирать столбцы (которые правильно работают с is.finite()) примерно так:

df.is.finite=function(d)
{
  for (i in 1:ncol(d))
  {
    if(!(all(is.finite(d[,i]))))
    {
      return(FALSE)
    }
  }
  return(TRUE)
}

Если вы хотите использовать что-то подобное, вы, вероятно,хотите добавить некоторую проверку ввода, чтобы убедиться, что ввод является фреймом данных и т. д., и т. д. Кроме того, эта функция возвращает только одно логическое значение.Если вы хотите, чтобы он возвращал фрейм данных с соответствующими логическими значениями, не стесняйтесь настраивать его соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...