如何为空输入(而不是默认的+Inf和-Inf)指定R中Max,Min的自定义返回值?
Posted
技术标签:
【中文标题】如何为空输入(而不是默认的+Inf和-Inf)指定R中Max,Min的自定义返回值?【英文标题】:How to specify custom return value for Max, Min in R for empty input (instead of the default +Inf and -Inf)? 【发布时间】:2013-09-27 05:28:13 【问题描述】:在 R 中,我使用 Min 和 Max 来查找给定向量的最小值和最大值。
这个向量是计算和过滤的结果,通常可能是 NULL 或空列表。
在这种情况下,我们会收到如下警告:
警告信息:在 max(el) 中:max 没有非缺失参数; 返回 -Inf
如果您在一个循环(或层)内为多个输入执行此操作,您将开始遇到大量警告
Inf 的默认值不适合我的目的,而是希望返回 0 或其他一些值。
现在,除了每次在 if..else 条件下检查输入是否有效之外,还有什么方法可以在输入为空的情况下为这些 Min、Max 方法规定默认返回值。
例如,如果您使用 na.rm=TRUE,那么如果在删除 NA 后输入变为空,则很难预先检查输入。 另一种情况是 min(which())。首先检查 which() 的返回值,然后有条件地提供给 min() 并不是我真正想要的。此外,对 Min、Max 结果进行后处理以手动删除/替换 Inf 为我自己的值并不是真正有效的方法。
那么,有没有什么有效的方法让 R 从 Min、Max 中返回我自己的自定义默认值(对于空向量,而不是 +Inf 和 -Inf ??
使用 if..else 检查的预处理和使用 Inf 替换的后处理并不那么优雅。
如果围绕 Min 编写自定义包装器,Max 是唯一的方法,您建议如何在不影响速度或优雅的情况下编写它?
【问题讨论】:
R 区分大小写。如果要引用函数,请确保不要将小写字母更改为大写字母。 您真的要指定任意自定义值,还是只禁止 +Inf/-Inf/NaN?在所有情况下,NA 似乎都是一个完美的抑制值。 【参考方案1】:好吧,它可能并不优雅,但这似乎有效:
mymax <- function(...,def='hello world',na.rm=FALSE)
if(!is.infinite(x<-suppressWarnings(max(...,na.rm=na.rm)))) x else def
mymax() # 'hello world'
mymax(def=2) # 2
mymax(c(),NULL,def=2) # 2
mymax(c(),NA) # NA
mymax(1,c(NA,3),na.rm=TRUE) # 1
而且速度并不慢...
require(microbenchmark)
test <- rnorm(1e5)
microbenchmark(
max=max(test),
mymax=mymax(test)
)
# Unit: milliseconds
# expr min lq median uq max neval
# max 1.135445 1.141384 1.143814 1.162171 1.689940 100
# mymax 1.119248 1.123297 1.147054 1.190517 1.660244 100
【讨论】:
【参考方案2】:hablar 包中有一个解决方案,它解决了在给定空向量时 min/max 返回 Inf 的问题。函数 s 将一个空向量 (NULL) 转换为 NA。
问题
min(NULL)
[1] Inf
Warning message:
In min(NULL) : no non-missing arguments to min; returning Inf
解决方案
library(hablar)
min(s(NULL))
[1] NA
免责声明自从我编写了这个包以来,我对这个解决方案有偏见。
【讨论】:
以上是关于如何为空输入(而不是默认的+Inf和-Inf)指定R中Max,Min的自定义返回值?的主要内容,如果未能解决你的问题,请参考以下文章