Подтвердить что ты не робот

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

Я пытаюсь найти range кадра данных с бесконечными значениями:

> 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

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

4b9b3361

Ответ 1

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

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

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

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

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

Чтобы подтвердить:

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