R 平行';或';对多个逻辑向量的运算

R 平行';或';对多个逻辑向量的运算,r,parallel-processing,logical-operators,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=

在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

我们可以使用
Reduce
|

Reduce(`|`, list(A, B, C))
或使用
行和

rowSums(cbind(A,B,C))!=0
如果只有3个向量,则可以使用压缩选项

!!(A+B+C)

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

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)
这将在我的macbook air w/I7处理器上产生以下结果

Unit: nanoseconds
 expr min lq     mean median  uq   max neval
  f.0  39 57 118.4767     78 123 23685 10000
  f.a  43 61 119.5952     85 130 63523 10000
  f.b  38 53 100.5252     77 120 27199 10000
  f.c  39 55 100.9784     77 121 17656 10000
  f.d  37 52 111.5138     75 118 78505 10000
  f.e  39 57 113.1461     80 125 16111 10000
  f.f  35 52 105.9245     74 117 19995 10000

所以它们看起来都很接近,我最初的方法不是最慢的,但也不是最快的…

matrixStats::rowAnys(cbind(A,B,C))
@khasha谢谢。添加到基准测试中。相关:我不能保证向量的数量,数量只能在运行时知道,因此,前两个可以工作,最后一个不行。@NicholasHamilton感谢您的回复。我将把它留给其他有3或4个向量的人。这里还有另一个选项:
!!(Reduce(“+”,lappy(字母[1:3],get))
@NicholasHamilton代替
get
,你可以使用
Reduce(“+”,mget(字母[1:3]))
任何人想对所有这些变化进行基准测试吗?我可以建议使用整洁的
微基准
软件包吗?是的。很公平。不同的图片。当你得到几个答案时,做基准测试是一个很好的主意。@Roland,干杯,我修改了代码来测试长度为1e6的向量