R:可以范围(data.frame)排除无限值吗?

时间:2015-05-21 19:49:44

标签: r range infinity

我试图找到具有无限值的数据框的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

这是一个错误吗?它知道了吗?我应该报告吗?

2 个答案:

答案 0 :(得分:6)

您需要使用(正如David在评论中指出的那样):

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)相关,发生了一些有趣的事情:

  

range是一个通用函数:可以直接或通过Summary group generic定义方法。为了使其正常工作,参数...应该是未命名的,并且dispatch在第一个参数上。

所以基本上,当检查它的参数时,它认为finite=TRUE是检查范围的数据的一部分,因为它是逻辑的,它无法通过数值测试。也就是说,一旦它通过检查,它就会正确计算。

确认:

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

答案 1 :(得分:2)

可能存在多种可能性。如果一切都是数字,那么一个是

> f <- data.frame(x=c(1,2),y=c(3,Inf))
> range(as.matrix(f),finite=TRUE)
[1] 1 3