我试图找到具有无限值的数据框的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
这是一个错误吗?它知道了吗?我应该报告吗?
答案 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