जवाबों:
कोशिश करते हुए ?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
।