जवाबों:
कोशिश करते हुए ?max, आप देखेंगे कि यह वास्तव में एक na.rm =तर्क है, डिफ़ॉल्ट रूप से निर्धारित किया गया है FALSE। (यही कारण है कि सहित कई अन्य अनुसंधान कार्य, के लिए आम डिफ़ॉल्ट है sum(), mean()आदि)
सेटिंग na.rm=TRUEवही करता है जो आप पूछ रहे हैं:
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
यदि आप सभी को हटाना चाहते हैं NA, तो इस मुहावरे का उपयोग करें:
d <- d[!is.na(d)]
एक अंतिम नोट: अन्य फ़ंक्शन (जैसे table(), lm()और sort()) में NAविभिन्न-नामों का उपयोग करने वाले तर्क हैं (और विभिन्न विकल्प प्रदान करते हैं)। इसलिए यदि NAआपको फ़ंक्शन कॉल में समस्याएँ आती हैं, तो यह फ़ंक्शन के तर्कों के बीच अंतर्निहित समाधान की जाँच करने के लायक है। मैंने पाया है कि आमतौर पर वहां पहले से ही एक है।
max()व्यवहार करता है (जैसे, उदाहरण के लिए, जब करते हैं max(c(NA, NA))। व्यक्तिगत रूप से, मुझे लगता है कि इसका व्यवहार उचित है; मुझे उम्मीद है कि इसका निर्माण उस तरह से किया गया था, ताकि आप चीजों को करते समय अपेक्षित परिणाम प्राप्त कर सकेंa <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
NAपायथन के उत्कृष्ट NumPy पैकेज में आर-जैसे -हैंडलिंग सुविधाओं को शामिल करने में लगे हुए थे ।)
NAएस के एक वेक्टर से सभी को हटाते हैं, तो आप NAखाली वेक्टर की अपेक्षा करेंगे,-you नहीं।
?maxआपको दिखाता है कि एक अतिरिक्त पैरामीटर है na.rmजिसे आप सेट कर सकते हैं TRUE।
इसके अलावा, यदि आप वास्तव में NAएस को हटाना चाहते हैं , तो बस कुछ का उपयोग करें:
myvec[!is.na(myvec)]
na.omitएक डेटाफ्रेम विधि के भी है, इसलिए अधिक सामान्य है।
आप कॉल कर सकते हैं max(vector, na.rm = TRUE)। अधिक सामान्यतः, आप na.omit()फ़ंक्शन का उपयोग कर सकते हैं ।
बस अगर कोई नया आर आर मूल प्रश्न का एक सरलीकृत उत्तर चाहता है
मैं वेक्टर से NA मान कैसे निकाल सकता हूं?
यह रहा:
मान लें कि आपके पास एक वेक्टर fooहै:
foo = c(1:10, NA, 20:30)
रनिंग length(foo)22 देता है।
nona_foo = foo[!is.na(foo)]
length(nona_foo) 21 है, क्योंकि NA मानों को हटा दिया गया है।
याद रखें कि is.na(foo)एक बूलियन मैट्रिक्स है, इसलिए fooइस मूल्य के विपरीत के साथ अनुक्रमण आपको उन सभी तत्वों को देगा जो NA नहीं हैं।
Purrr (सूचियों और वैक्टर के साथ काम करता है) discardसे उपयोग करें ।
discard(v, is.na)
लाभ यह है कि पाइप का उपयोग करना आसान है; वैकल्पिक रूप से अंतर्निहित सब-कमिंग फ़ंक्शन का उपयोग करें [:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
ध्यान दें कि na.omitसूचियों पर काम नहीं करता है:
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA
मैंने दो baseदृष्टिकोणों की तुलना करते हुए एक त्वरित बेंचमार्क चलाया और यह पता चला कि इससे x[!is.na(x)]अधिक तेज़ है na.omit। उपयोगकर्ता qwrने सुझाव दिया कि मैं purrr::dicardभी कोशिश करता हूं - यह बड़े पैमाने पर धीमा निकला (हालांकि मैं खुशी से मेरे कार्यान्वयन और परीक्षण पर टिप्पणी करूंगा)
microbenchmark::microbenchmark(
purrr::map(airquality,function(x) {x[!is.na(x)]}),
purrr::map(airquality,na.omit),
purrr::map(airquality, ~purrr::discard(.x, .p = is.na)),
times = 1e6)
Unit: microseconds
expr min lq mean median uq max neval cld
purrr::map(airquality, function(x) { x[!is.na(x)] }) 66.8 75.9 130.5643 86.2 131.80 541125.5 1e+06 a
purrr::map(airquality, na.omit) 95.7 107.4 185.5108 129.3 190.50 534795.5 1e+06 b
purrr::map(airquality, ~purrr::discard(.x, .p = is.na)) 3391.7 3648.6 5615.8965 4079.7 6486.45 1121975.4 1e+06 c
संदर्भ के लिए, का मूल परीक्षण है x[!is.na(x)]बनाम na.omit:
microbenchmark::microbenchmark(
purrr::map(airquality,function(x) {x[!is.na(x)]}),
purrr::map(airquality,na.omit),
times = 1000000)
Unit: microseconds
expr min lq mean median uq max neval cld
map(airquality, function(x) { x[!is.na(x)] }) 53.0 56.6 86.48231 58.1 64.8 414195.2 1e+06 a
map(airquality, na.omit) 85.3 90.4 134.49964 92.5 104.9 348352.8 1e+06 b
purrr:discard
-Infलिए देता हैd।