使用逻辑或组合列表中的逻辑向量

whi*_*ile 12 r

如何在列表中有效地组合列表中的逻辑向量,or以便获得相同长度的向量?

我有一个列表opts与一组相同长度的逻辑向量.

> str(opts)
List of 7
 $ option1: logi [1:608247] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ option2: logi [1:608247] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ option3: logi [1:608247] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ option4: logi [1:608247] FALSE TRUE  FALSE TRUE  TRUE  TRUE  ...
 $ option5: logi [1:608247] FALSE TRUE  FALSE FALSE TRUE  FALSE ...
 $ option6: logi [1:608247] FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ option7: logi [1:608247] FALSE FALSE FALSE FALSE FALSE FALSE ...
Run Code Online (Sandbox Code Playgroud)

我希望这样做:

logi [1:608247] FALSE TRUE FALSE TRUE TRUE TRUE ...
Run Code Online (Sandbox Code Playgroud)

我很好将我的数据结构更改为一个matrixdata.frame其他东西,如果它更好我只是从一个lapply.

Ric*_*rta 27

如何减少:

Reduce("&", opts)
Reduce("|", opts)
Run Code Online (Sandbox Code Playgroud)

  • +1这是最干净的解决方案,根据我的基准测试,也是最快的. (2认同)

mri*_*rip 6

如果所有列表的长度相同,则可以将其强制转换为数据框,然后使用any:

apply(data.frame(opts),1,any)
Run Code Online (Sandbox Code Playgroud)

编辑:虽然我认为这可能很快,因为它避免cbind了,根据我的基准测试结果,这是迄今为止三种解决方案中最慢的:

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

require(microbenchmark)
microbenchmark(Reduce("|",opts),rowSums(do.call(cbind, opts)) > 0,
               apply(as.data.frame(opts),1,any))


Unit: microseconds
                               expr      min        lq   median        uq
                  Reduce("|", opts)   99.200  101.0780  106.596  110.3725
  rowSums(do.call(cbind, opts)) > 0  209.326  211.9665  217.329  224.0505
 apply(as.data.frame(opts), 1, any) 4130.429 4245.7380 4308.054 4438.2485
     max neval
  120.63   100
  237.19   100
 6949.19   100
Run Code Online (Sandbox Code Playgroud)