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 

पुनश्च:

मैं के लिए एक ऑपरेटर x जिसके लिए

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

तो मैं क्या कर सकता है खोज कर रहा हूँ

result <- a x b 
+1

इसे वास्तविक आर वाक्यविन्यास में रखना उपयोगी होगा, इसलिए यह स्पष्ट है कि आप क्या पूछ रहे हैं। – Thomas

+2

आप 'any' ...' xx <- c (1,2,3, NA, 4,5) आज़मा सकते हैं; कोई भी (is.na (xx)) ' – Arun

+1

@ अरुण 'कोई भी'' '' और '|' का विस्तार है, वास्तव में हॉफमैन चाहता है जिस तरह से काम करता है। '&' का विस्तार 'सभी 'है और इसका एक ही मुद्दा – 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 

संपादित करें: बेंचमार्किंग:

यह चाहिए ध्यान दें कि डेसन का दृष्टिकोण सबसे तेज़ है, जैसा कि नीचे दिखाया गया है:

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 

अजीब बात है, संकलक परिवर्तन नहीं होता है यहाँ कुछ भी!

+0

ज़रूर! मेरा मुख्य सुझाव यह था कि हम अपना खुद का ऑपरेटर बना सकते हैं क्योंकि मुझे नहीं लगता कि इसमें एक बनाया गया है जो हम चाहते हैं। मेरे उत्तर में बुलियन बीजगणित का पालन करना बहुत बुरा नहीं होना चाहिए, हालांकि किसी भी दर पर सत्य तालिका (जैसे आपने किया) बनाने के लिए पर्याप्त आसान है यह देखने के लिए कि यह वांछित उत्तर देता है। हालांकि अच्छा विकल्प! – Dason

+0

@Dason और आपका उत्तर सबसे तेज़ है, ऊपर संपादित देखें! –

संबंधित मुद्दे