2013-06-17 9 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);任意の(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 

EDIT:ベンチマーク:

それが必要に以下に示すように、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とあなたの答えは最速です、上記の編集を参照してください! –

関連する問題