如何在列表中有效地组合列表中的逻辑向量,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)
我很好将我的数据结构更改为一个matrix或data.frame其他东西,如果它更好我只是从一个lapply.
Ric*_*rta 27
如何减少:
Reduce("&", opts)
Reduce("|", opts)
Run Code Online (Sandbox Code Playgroud)
如果所有列表的长度相同,则可以将其强制转换为数据框,然后使用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)
| 归档时间: |
|
| 查看次数: |
7493 次 |
| 最近记录: |