如何为空输入(而不是默认的+ Inf和-Inf)中的Max,Min in R指定自定义返回值?

时间:2013-09-22 04:16:56

标签: r

在R中,我使用Min和Max来查找给定向量的最小值和最大值。

此向量是计算和过滤的结果,通常可能是NULL或空列表。

在这种情况下,我们会收到警告,例如:

  

警告消息:在max(el)中:max没有非缺失参数;   返回-Inf

如果你在一个循环(或层)中为多个输入执行此操作,您将开始遇到大量警告

Inf的默认值不适合我的目的,而是希望返回0或其他值。

现在,除了每次检查输入是否对if..else条件有效外,有没有办法在空输入的情况下为这些Min,Max方法规定默认返回值。

  • 例如,如果您使用na.rm = TRUE,那么如果在删除NA后它将变为空,则很难预先检查输入。
  • 另一种情况是min(which())。首先检查其返回值()然后有条件地提供给min()并不是我想要的。

此外,后处理Min,Max结果以手动删除/替换我自己的值并不是真正有效的方法。

那么,是否有任何有效的方法要求R从Min,Max返回我自己的自定义默认值为空向量,而不是+ Inf和-Inf ??

使用if..else进行预处理并使用Inf替换进行后处理并不是那么优雅。

如果在Min周围编写自定义包装器,Max是唯一的方法,你会建议如何写它而不影响速度或优雅?

2 个答案:

答案 0 :(得分:8)

嗯,这可能并不优雅,但这似乎有效:

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

答案 1 :(得分:0)

在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

免责声明自从我编写了该程序包以来,我对这种解决方案就有偏见。