NA识别布尔运算符

时间:2013-06-17 13:15:51

标签: r boolean 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

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

所以我可以做到

result <- a x b

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

注意:%&2%是一个有趣的选择,我刚刚发现运气: - )

让我们编译所有这些,看看会发生什么:

`%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

有趣的是,编译器在这里没有任何改变!