16

質問

logical OR( |) を使用した要素ごとの比較を使用して、リスト全体で論理ベクトルを効果的に組み合わせるにはどうすればよいですか。結果は、入力ベクトルと同じ長さの論理ベクトルになります。入力値のいずれかが の場合TRUE、結果はTRUEになります。それ以外の場合、結果は になりFALSEます。

同じ長さの論理ベクトルのセットを持つリスト opts があります。

> str(opts)
List of 5
 $ option1: logi [1:608247] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ option2: logi [1:608247] FALSE TRUE  FALSE TRUE  TRUE  TRUE  ...
 $ option3: logi [1:608247] FALSE TRUE  FALSE FALSE TRUE  FALSE ...
 $ option4: logi [1:608247] FALSE FALSE FALSE FALSE FALSE FALSE ...

結果としてこれが欲しい:

logi [1:608247] FALSE TRUE FALSE TRUE TRUE TRUE ...

したがって、結果の最初の値 は、がリストのすべてのベクトルの最初の位置にないFALSEためです。結果の 2 番目の値 は、ベクトルの 2 番目の位置にが2 つ (少なくとも 1 つ)あるためです。 TRUETRUEanyTRUE

matrixからこれを取得する方が良い場合は、データ構造をまたはdata.frameまたは何か他のものに変更しても問題ありませんlapply

4

4 に答える 4

36

リデュースはどうですか:

Reduce("&", opts)
Reduce("|", opts)
于 2013-10-08T14:38:19.447 に答える
4

You can do:

(rowSums(do.call(cbind, opts)) > 0)

For example:

opts = as.list(as.data.frame(matrix(sample(c(TRUE, FALSE), 10000, replace=TRUE), nrow=1000)))
str(opts)

do.call(cbind, opts) creates a 1000x10 matrix of TRUEs and FALSEs:

dim(do.call(cbind, opts))
# [1] 1000   10
head(do.call(cbind, opts))
#        V1    V2    V3    V4    V5    V6    V7    V8    V9   V10
#[1,]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE
#[2,] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
#[3,] FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
#[4,] FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE
#[5,] FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE
#[6,] FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE

rowSums will create a vector showing the number of TRUE values in each row: in any case where that row sum is greater than 0, logical or returns TRUE.

于 2013-10-08T14:32:30.177 に答える