2015-05-21 2 views
10

Я пытаюсь найти range кадра данных с бесконечными значениями:R: может диапазон (data.frame) исключать бесконечные значения?

> f <- data.frame(x=c(1,2),y=c(3,Inf)) 
> range(f) 
[1] 1 Inf 
> range(f,finite=TRUE) 
Error in FUN(X[[2L]], ...) : 
    only defined on a data frame with all numeric variables 
Calls: Summary.data.frame -> lapply -> FUN 
> range(f$y) 
[1] 3 Inf 
> range(f$y,finite=TRUE) 
[1] 3 3 

Почему я получаю сообщение об ошибке?

Могу ли я сделать лучше, чем

> do.call(range,lapply(f,range,finite=TRUE)) 
[1] 1 3 

Является ли это ошибка? Известно ли это? Должен ли я сообщить об этом?

+6

'диапазона (unlist (F), конечный = TRUE)'? –

+0

это ошибка (известная?)? – sds

+2

Хм .. похоже, что некоторые методы проблемы. 'range.default' отлично работает, например' range.default (f, final = TRUE) ' –

ответ

6

Вы должны использовать (как Давид указывает в комментариях):

range.default(f, finite=TRUE) 
# [1] 1 3 

или

range(f, finite=1) 
# [1] 1 3 

Функция ошибочно требует finite быть числовое, но затем правильно использует его при удалении бесконечных значений. Примечание:

f2 <- data.frame(x=1:2, y=3:4) 
range(f2, finite=TRUE) # Error 

Очевидно что-то смешное, что происходит с родовым быть примитивным и ваш аргумент является объектом, вероятно, связано с (от ?range):

диапазон общая функция: методы могут быть определенные для него напрямую или с помощью общей группы «Сводка». Для правильной работы аргументы ... должны быть не указаны, а отправка - по первому аргументу.

Так в основном, при проверке его аргументы, он считает, что finite=TRUE является частью данных, чтобы проверить диапазон дальше, и так как он является логическим это не проходит тест на numericness. Тем не менее, как только это пройдет, проверка будет правильно подсчитана.

Для подтверждения:

range(f, finite=2000) 
# [1] 1 3 
2

Возможно, существует множество возможностей. Если все числовые, то один

> f <- data.frame(x=c(1,2),y=c(3,Inf)) 
> range(as.matrix(f),finite=TRUE) 
[1] 1 3 
Смежные вопросы