2013-06-17 5 views
7

부품 중 하나라도 NA 인 경우 NA을 제공하는 불리언 값이 있습니까? 현재NA 인식 부울 연산자

NA & FALSE == FALSE 
FALSE & NA == FALSE 
NA & TRUE == NA 
TRUE & NA == NA 

내가 가지고 싶습니다

NA x FALSE == NA 
FALSE x NA == NA 

PS :

내가

x  | a=TRUE | =FALSE | =NA 
----------------------------------- 
b=TRUE | TRUE | FALSE | NA 
=FALSE | FALSE | FALSE | NA 
=NA | NA | NA | NA 

그래서 내가 할 수있는 운영자 X 찾고 있어요

result <- a x b 
+1

실제 R 구문에 넣어두면 도움이 될 것입니다. – Thomas

+2

당신은'any'를 시도 할 수 있습니다 ...'xx <- c (1,2,3, NA, 4,5); any (is.na (xx))' – Arun

+1

@Arun'any'는'|'의 확장이며'|'는 실제로 호프만이 원하는 방식으로 작동합니다. '&'의 확장자는'all'이며 동일한 문제가 – Dason

답변

9

원하는대로 원하는 고유 한 연산자를 정의 할 수 있습니다.

> `%and%` <- function(x, y){as.logical(x*y)} 
> NA %and% FALSE 
[1] NA 
> FALSE %and% NA 
[1] NA 
> NA %and% TRUE 
[1] NA 
> TRUE %and% NA 
[1] NA 
6

Dason의 접근 방식은 시원하지만, 인간에 의해 더 읽기 무언가를 원하는 경우,이 사용

`%&%` <- function(e1, e2) ifelse(is.na(e1)|is.na(e2), NA, e1 & e2) 

결과 :

> x <- c(TRUE, FALSE, NA) 
> outer(x, x, `%&%`) 
     [,1] [,2] [,3] 
[1,] TRUE FALSE NA 
[2,] FALSE FALSE NA 
[3,] NA NA NA 

편집 : 벤치마킹 :

그것은해야을 다음과 같이 Dason의 접근 방식이 가장 빠릅니다.

library(microbenchmark) 
library(compiler) 

x <- sample(c(TRUE, FALSE, NA), size=1e3, TRUE) 
y <- sample(c(TRUE, FALSE, NA), size=1e3, TRUE) 

`%&1%` <- function(e1, e2) ifelse(is.na(e1)|is.na(e2), NA, e1 & e2) 
`%&2%` <- function(x, y) (!x | y) & (x | y) & (x | !y) 
`%and%` <- function(x, y)as.logical(x*y) 

참고 :

`%C&2%` <- cmpfun(`%&2%`) 
`%C&1%` <- cmpfun(`%&1%`) 
`%Cand%` <- cmpfun(`%and%`) 

> microbenchmark(x %&1% y, x %&2% y, x %and% y, x %C&1% y, x %C&2% y, x %Cand% y, times=1000) 
Unit: microseconds 
     expr  min  lq median  uq  max neval 
    x %&1% y 201.575 206.124 208.574 211.024 1822.917 1000 
    x %&2% y 86.439 87.140 87.839 88.190 1244.441 1000 
    x %and% y 13.299 13.999 14.349 14.700 1141.905 1000 
    x %C&1% y 200.525 205.775 208.574 210.674 1554.151 1000 
    x %C&2% y 84.690 85.390 86.090 86.440 1212.596 1000 
x %Cand% y 13.299 13.649 14.349 14.699 1141.555 1000 

재미, 컴파일러가 변경되지 않습니다 %&2%이의 일이 무엇인지보기 위해이 모든 것을 컴파일하자 난 그냥

:-) 행운에 의해 발견 한 재미있는 대안이다 아무것도 없어!

+0

예! 내 주요 제안은 우리가 원하는 것을 수행하는 내장 된 연산자가 없다고 생각하기 때문에 우리 자신의 연산자를 구축 할 수 있다는 것입니다. 부울 대수학은 내 대답에 따라 너무 나쁘지 않아야하며, 어쨌든 진리표를 작성하여 (원하는 것처럼) 원하는 답을 얻을 수있을만큼 쉽습니다. 좋은 대안! – Dason

+0

@Dason 그리고 귀하의 답변이 가장 빠릅니다. 위의 편집을 참조하십시오! –