如何为空输入(而不是默认的+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的自定义返回值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 1**Inf 的值等于 1,而不是 NaN?

为啥“np.inf // 2”会导致 NaN 而不是无穷大?

[记] C语言中的nan和inf

web.xml中相关配置

web-inf 和 jsp 页面指令

如何为广播身份验证路由定义或传递身份验证防护而不是默认身份验证防护?