1

我正在尝试将 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 对象的结构以立即理解比较失败吗?

谢谢!

4

3 回答 3

5

int(0)意味着它是一个长度为零的向量(即它没有元素,它是空的,等等)。即使您执行类似tmp == integer(0)获得零长度逻辑向量的操作,也不是TRUEor FALSE

根据?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.

于 2012-05-08T14:30:54.383 回答
3

您可以是否 tmpnumeric(0)为:

length(tmp) == 0
于 2012-05-08T14:30:13.183 回答
2

如果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
于 2012-05-08T14:35:46.787 回答