8

在 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 是唯一的方法,你会建议如何在不影响速度或优雅的情况下编写它?

4

2 回答 2

9

好吧,它可能并不优雅,但这似乎有效:

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
于 2013-09-22T05:29:17.430 回答
1

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

免责声明我对这个解决方案有偏见,因为我编写了这个包。

于 2018-10-31T07:31:11.997 回答