R: range(data.frame) 可以排除无限值吗?
R: can range(data.frame) exclude infinite values?
我正在尝试查找具有无限值的数据框的 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
这是一个错误吗?它是已知的吗?我应该举报吗?
大概有多种可能。如果一切都是数字那么一个是
> f <- data.frame(x=c(1,2),y=c(3,Inf))
> range(as.matrix(f),finite=TRUE)
[1] 1 3
您需要使用(正如大卫在评论中指出的那样):
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 is a generic function: methods can be defined for it directly or via the Summary group generic. For this to work properly, the arguments ... should be unnamed, and dispatch is on the first argument.
所以基本上,在检查其参数时,它认为 finite=TRUE
是要检查范围的数据的一部分,并且由于它是合乎逻辑的,因此无法通过数字性测试。也就是说,一旦它通过检查,它就会正确计算。
确认:
range(f, finite=2000)
# [1] 1 3
我正在尝试查找具有无限值的数据框的 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
这是一个错误吗?它是已知的吗?我应该举报吗?
大概有多种可能。如果一切都是数字那么一个是
> f <- data.frame(x=c(1,2),y=c(3,Inf))
> range(as.matrix(f),finite=TRUE)
[1] 1 3
您需要使用(正如大卫在评论中指出的那样):
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 is a generic function: methods can be defined for it directly or via the Summary group generic. For this to work properly, the arguments ... should be unnamed, and dispatch is on the first argument.
所以基本上,在检查其参数时,它认为 finite=TRUE
是要检查范围的数据的一部分,并且由于它是合乎逻辑的,因此无法通过数字性测试。也就是说,一旦它通过检查,它就会正确计算。
确认:
range(f, finite=2000)
# [1] 1 3