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

sds*_*sds 10 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
Run Code Online (Sandbox Code Playgroud)

为什么我收到错误?

我可以做得更好吗?

> do.call(range,lapply(f,range,finite=TRUE))
[1] 1 3
Run Code Online (Sandbox Code Playgroud)

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

Bro*_*ieG 6

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

range.default(f, finite=TRUE)
# [1] 1 3
Run Code Online (Sandbox Code Playgroud)

要么

range(f, finite=1)
# [1] 1 3
Run Code Online (Sandbox Code Playgroud)

该函数错误地要求finite是数字,但然后正确地使用它来删除无限值.注意:

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

显然,通用是一个原始的,而你的论点是一个对象,可能与(来自?range)相关:

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

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

确认:

range(f, finite=2000)
# [1] 1 3
Run Code Online (Sandbox Code Playgroud)