7

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
4

2 に答える 2

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
于 2013-06-17T13:21:50.440 に答える
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

面白いことに、コンパイラはここでは何も変更しません!

于 2013-06-17T13:40:05.967 に答える