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

str(tmp)はint(0)を返しますが、結果はFALSE、FALSE、およびFALSEになります。

回避策として私がしたことはこれです:

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

which.max()が最大値を検出したかどうかに関係なく、これは差別化で機能します。ただし、上記の比較が機能しない理由がわかりません。

おまけの質問:比較の失敗を即座に理解するためにtmpオブジェクトの構造を簡単に示してくれたstr()以外の関数はありますか?

ありがとう!

4

3 に答える 3

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

于 2012-05-08T14:30:54.383 に答える
3

tmp がnumeric(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 に答える