在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
答案 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)
所以他们看起来都非常接近,我的初始方法不是最慢的,但也不是最快的...