为什么我不能测试which.max()对0

时间:2012-05-08 14:20:58

标签: r

我试图将which.max与0的结果进行比较,以检查数据中是否找到任何最大值。解释:我必须检查大约24.000个向量的最大索引。

这是一个小例子:

tmp <- which.max(c(NA, NA, NA, NA))
str(tmp)
tmp == 0
as.integer(tmp) == 0
as.numeric(tmp) == 0

结果为FALSE,FALSE和FALSE - 尽管str(tmp)返回int(0)。

我的解决方法是:

tmp <- which.max(c(NA, NA, NA, NA))
isTRUE(as.logical(tmp))

如果which.max()找到了最大值,那么这种方式可以区别对待。但是我不明白为什么上述比较不起作用。

奖金问题:还有另一个函数而不是str()能够很容易地向我展示tmp对象的结构,以便立即理解比较失败吗?

谢谢!

3 个答案:

答案 0 :(得分:5)

int(0)表示它是零长度向量(即它没有元素,它是空的,等等)。即使您执行tmp == integer(0)之类的操作,也会获得零长度逻辑向量,而不是TRUEFALSE

根据?which.max

  

值:

 Missing and ‘NaN’ values are discarded.

 an ‘integer’ of length 1 or 0 (iff ‘x’ has no non-‘NA’s), giving
 the index of the _first_ minimum or maximum respectively of ‘x’.

所以你想查看是否length(tmp) > 0

答案 1 :(得分:2)

你可以将tmp numeric(0)视为:

length(tmp) == 0

答案 2 :(得分:1)

如果which.max在未找到最大值时返回0-1,则可能会更好。然后你可以更容易地检查它。例如regexpr返回-1match允许您指定在不匹配的情况下返回的内容(这可能与之类似)。

...但您可以自己检查返回值的长度:

x <-  which.max(c(NA, NA, NA, NA))
if(length(x)) {
  # Do stuff with x...
}

...或将其包装成函数以简化事情:

which.max2 <- function(x) {
    x <-  which.max(x)
    if(length(x)) x else 0L
}

which.max2(c(NA,-Inf,NA)) # 2
which.max2(c(NA,NA))      # 0