R NA识别布尔算子

R NA识别布尔算子,r,boolean,na,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 附言: 我正在搜索一个运算符x,该运算符 x | a=TRUE | =FALSE | =NA --------------------------------

如果任何部分是
NA
,是否有一个布尔运算器给我提供
NA
? 目前

NA & FALSE == FALSE
FALSE & NA == FALSE
NA & TRUE  == NA
TRUE & NA  == NA
我想要:

NA x FALSE == NA
FALSE x NA == NA
附言:

我正在搜索一个运算符x,该运算符

  x     |  a=TRUE  |  =FALSE | =NA
-----------------------------------
b=TRUE  |    TRUE  |   FALSE |  NA
 =FALSE |    FALSE |   FALSE |  NA
 =NA    |    NA    |   NA    |  NA
所以我可以

result <- a x b

result您可以定义自己的运算符来执行所需的操作

> `%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
`%and%`NA%and%FALSE
[1] NA
>FALSE%和%NA
[1] NA
>NA%和%TRUE
[1] NA
>TRUE%和%NA
[1] NA

达森的方法很酷,但如果想让凡人更容易阅读,请使用以下方法:

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

有趣的是,编译器在这里不会改变任何东西

把它放在实际的R语法中会很有帮助,这样就可以清楚地知道你在问什么
xx@Arun
any
|
的扩展,
|
实际上按照霍夫曼想要的方式工作。
&
的扩展名是
all
,它具有相同的issue@Dason,马上。我被纠正了,当然!我的主要建议是,我们可以建立自己的运营商,因为我认为没有一个内置的运营商可以满足我们的需求。我的答案中的布尔代数应该不会太糟糕,无论如何,构建真值表(就像您所做的那样)非常容易,以确保它给出所需的答案。不错的选择!
> x <- c(TRUE, FALSE, NA)
> outer(x, x, `%&%`)
      [,1]  [,2] [,3]
[1,]  TRUE FALSE   NA
[2,] FALSE FALSE   NA
[3,]    NA    NA   NA
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