वेक्टर से NA मान निकालें


191

मेरे पास एक बहुत बड़ा वेक्टर है जिसमें कुछ NAमूल्य हैं, और मैं उस वेक्टर में अधिकतम मूल्य (वेक्टर सभी संख्याओं) को खोजने की कोशिश कर रहा हूं, लेकिन मैं NAमूल्यों के कारण ऐसा नहीं कर सकता ।

मैं NAमूल्यों को कैसे हटा सकता हूं ताकि मैं अधिकतम गणना कर सकूं?

जवाबों:


265

कोशिश करते हुए ?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आपको फ़ंक्शन कॉल में समस्याएँ आती हैं, तो यह फ़ंक्शन के तर्कों के बीच अंतर्निहित समाधान की जाँच करने के लायक है। मैंने पाया है कि आमतौर पर वहां पहले से ही एक है।


यह बहुत बुरा विचार है। यह विफल रहता है और सभी NA के -Infलिए देता है d
23:39 पर user3932000

@ user3932000 दूसरों के लिए स्पष्ट होने के लिए, आपकी शिकायत वास्तव में यह है कि आधार आर फ़ंक्शन कैसे max()व्यवहार करता है (जैसे, उदाहरण के लिए, जब करते हैं max(c(NA, NA))। व्यक्तिगत रूप से, मुझे लगता है कि इसका व्यवहार उचित है; मुझे उम्मीद है कि इसका निर्माण उस तरह से किया गया था, ताकि आप चीजों को करते समय अपेक्षित परिणाम प्राप्त कर सकेंa <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
जोश ओ'ब्रायन

@ user3932000 कुछ हद तक एक डेटा विश्लेषण मंच के रूप में आर की कई खूबियों में से एक है, इसके लापता डेटा का परिष्कृत संचालन है, इसके लेखकों की ओर से बहुत सावधानी से विचार किया गया है। (यदि आप इस विषय में रुचि रखते हैं, तो कुछ ऐसे मुद्दों की अच्छी चर्चा के लिए यहां देखें , जो प्रोग्रामर के दृष्टिकोण से हैं, जो NAपायथन के उत्कृष्ट NumPy पैकेज में आर-जैसे -हैंडलिंग सुविधाओं को शामिल करने में लगे हुए थे ।)
जोश ओ'ब्रायन

@ user3932000: क्या यह उत्तर वास्तव में बुरा है? आप अशक्त सेट के अधिकतम पर क्या विचार करेंगे?
एबी एबी

@CliffAB इसमें अधिकतम नहीं है। आप अधिकतम -∞ (और मिनट से + to) तक असाइन कर सकते हैं, लेकिन यह हमेशा वांछित या सहज नहीं है। इसके अलावा, जब आप NAएस के एक वेक्टर से सभी को हटाते हैं, तो आप NAखाली वेक्टर की अपेक्षा करेंगे,-you नहीं।
user3932000

94

na.omitसमारोह क्या प्रतिगमन दिनचर्या का एक बहुत आंतरिक रूप से उपयोग करते हैं:

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000

20

?maxआपको दिखाता है कि एक अतिरिक्त पैरामीटर है na.rmजिसे आप सेट कर सकते हैं TRUE

इसके अलावा, यदि आप वास्तव में NAएस को हटाना चाहते हैं , तो बस कुछ का उपयोग करें:

myvec[!is.na(myvec)]

3
मुझे लगता है कि यह सबसे अच्छा है। na.rm और na.omit आउटपुट में बहुत थोड़ा जोड़ देते हैं।
मद्मिनी

सिवाय na.omitएक डेटाफ्रेम विधि के भी है, इसलिए अधिक सामान्य है।
IRTFM

15

आप कॉल कर सकते हैं max(vector, na.rm = TRUE)। अधिक सामान्यतः, आप na.omit()फ़ंक्शन का उपयोग कर सकते हैं ।


14

बस अगर कोई नया आर आर मूल प्रश्न का एक सरलीकृत उत्तर चाहता है

मैं वेक्टर से 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 नहीं हैं।


13

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

1

मैंने दो 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
qwr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.