2016-06-04 2 views
2

R에서는 논리적 벡터가 여러 개 있거나 숫자가 다양 할 때도 있습니다 (예 : 1, 때로는 n 벡터). 모두 동일한 길이로 보장됩니다. 입력 벡터와 동일한 길이의 단일 벡터를 생성합니다. 여기서 동일한 요소 색인에있는 벡터 중 하나가 TRUE 인 경우 TRUE, 그렇지 않으면 FALSE 인 경우 각 요소는 TRUE이됩니다.많은 논리 벡터에 대한 병렬 또는 연산

내가 원하는 것을 얻기 위해 기본 제공 작업이 있거나 더 간단한 방법이 있는지 궁금합니다. 아래는 제가 지금까지 가지고있는 벡터입니다.

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 
+1

'matrixStats :: rowAnys (cbind 아니었다, 가장 느린 아니었지만, B, C))' – Khashaa

+1

@Khashaa 고마워. 벤치마킹에 추가되었습니다. –

답변

3

우리는 컴팩트 한 옵션이 될 것 |

Reduce(`|`, list(A, B, C)) 

으로 또는 단지 3 벡터가있는 경우 rowSums

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

으로 Reduce을 사용할 수 있습니다

!!(A+B+C) 
+1

완벽 ......... –

+0

벡터의 수를 보장 할 수 없기 때문에 수량은 런타임에만 알 수 있으므로 처음 2 개가 작동하고 마지막 1 개는 작동하지 않습니다. –

+0

@NicholasHamilton 답장을 보내 주셔서 감사합니다. 나는 3이나 4 개의 벡터를 가진 다른 사람들을 위해 그런 것을 남겨 둘 것입니다. – akrun

2

@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) 

내 맥북 에어 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 

그래서 그들은 모두 서로 아주 가까이 보인다 내 최초의 방법은 (A 가장 빠른 ...

+0

깔끔한'microbenchmark' 패키지를 사용하도록 제안 할 수 있습니까? – Uwe

+0

예. 공정하다. 다른 그림을 바지. –

+0

여러 답변을 얻은 경우 벤치 마크를 수행하는 것이 좋습니다. – Uwe