在许多逻辑向量上并行'或'运算

时间:2016-06-04 06:58:37

标签: r parallel-processing logical-operators

在R中,我有许多逻辑向量或不同数量(即有时1,有时n向量),它们保证长度相同,我需要生成与输入向量长度相同的单个向量,如果同一元素索引处的任何向量为TRUE,则每个元素为TRUE,否则为FALSE

我想知道是否有内置操作或更简单的方法来实现我想要的。以下是我到目前为止的3个向量。

set.seed(1) #For reproducability
o = c(T,F)
l = 10
A = sample(o,l,replace=T)
B = sample(o,l,replace=T)
C = sample(o,l,replace=T)
fun = function(...) apply(do.call(cbind,args = list(...)),1,any)
fun(A,B,C) ##Produces Desired Result

2 个答案:

答案 0 :(得分:3)

我们可以将Reduce|

一起使用
Reduce(`|`, list(A, B, C))

rowSums

rowSums(cbind(A,B,C))!=0

如果只有3个向量,则紧凑选项为

!!(A+B+C)

答案 1 :(得分:2)

以下是上面列出的各种方法的一些基准,使用@Roland建议的更大的向量。

Yii::$app->authManager->assign('manager', '11');

在我的macbook air w / I7处理器上产生以下结果。

set.seed(1) #For reproducability
o = c(T,F)
l = 1000000
A = sample(o,l,replace=T)
B = sample(o,l,replace=T)
C = sample(o,l,replace=T)

library(microbenchmark)
f.0 = function() apply(do.call(cbind,args = list(A,B,C)),1,any)
f.a = function() Reduce(`|`, list(A, B, C))
f.b = function() rowSums(cbind(A,B,C))!=0
f.c = function() !!(A+B+C)
f.d = function() !!(Reduce('+',lapply(LETTERS[1:3],get)))
f.e = function() Reduce('|', mget(LETTERS[1:3]))
f.f = function() matrixStats::rowAnys(cbind(A, B, C))
microbenchmark(f.0,f.a,f.b,f.c,f.d,f.e,f.f,times=10000)

所以他们看起来都非常接近,我的初始方法不是最慢的,但也不是最快的...