जबरदस्ती से NAs शुरू करते समय चेतावनी से कैसे बचें


124

मैं आमतौर पर आर कोड करना पसंद करता हूं ताकि मुझे चेतावनी न मिले, लेकिन मुझे नहीं पता कि as.numericचरित्र वेक्टर में कनवर्ट करने के लिए चेतावनी प्राप्त करने से कैसे बचा जाए ।

उदाहरण के लिए:

x <- as.numeric(c("1", "2", "X"))

मुझे चेतावनी देगा क्योंकि इसने जबरदस्ती एनए को पेश किया था। मैं चाहता हूं कि एनए को जबरदस्ती के साथ पेश किया जाए - क्या यह बताने का एक तरीका है "हां यह वही है जो मैं करना चाहता हूं"। या मुझे सिर्फ चेतावनी के साथ रहना चाहिए?

या मुझे इस कार्य के लिए एक अलग फ़ंक्शन का उपयोग करना चाहिए?


8
?suppressWarningsशायद देखें ?
a5C1D2H2I1M1N2O1R2T1

4
इस चेतावनी से क्या समस्या है? आम तौर पर यह बहुमूल्य जानकारी देता है। मैं आर कंसोल में एक अधिक क्रियात्मक आउटपुट पसंद करता हूं जो कि आश्चर्यजनक आश्चर्य है।
रोलैंड

12
@ रोलैंड मैं पूरी तरह से सहमत हूं, लेकिन अगर आपको सिर्फ उन्हें अनदेखा करने की आदत है तो चेतावनियों की उपयोगिता कम हो जाती है। इसलिए मैं आम तौर पर चेतावनियों से "निपटना" पसंद करता हूं। इस मामले में, मैं हमेशा चेतावनी उत्पन्न करूंगा, और उनमें से बहुत सारे - मेरा डेटा एनए का प्रतिनिधित्व करने वाले "एक्स" के साथ तार में आ रहा है, और इसलिए फ़ंक्शन ठीक वही कर रहा है जो मैं करना चाहता हूं। मैं कहना चाहता था "मुझे बताने के लिए धन्यवाद, लेकिन यह ठीक है मुझे पता है कि मैं क्या कर रहा हूं"। suppressWarningsएकदम सही लगता है।
कोरोन

6
आप जानते हैं कि read.tableएक तर्क स्वीकार करता है na.strings?
रोलैंड

यदि आपके पास पहले से ही लाइब्रेरी में किसी ज्ञात बग के पास काम है, तो उन्हें दबा देना उपयोगी है। मैं इसे कैसे उपयोग करने जा रहा हूँ!
क्लेम वांग

जवाबों:


142

उपयोग करें suppressWarnings():

suppressWarnings(as.numeric(c("1", "2", "X")))
[1]  1  2 NA

यह चेतावनियों को दबा देता है।


यद्यपि यह पसंदीदा प्रतिक्रिया है, नीचे jangorecki द्वारा उत्तर मुझे, अधिक ठोस लगता है।
इयान

34

suppressWarnings()पहले ही उल्लेख किया गया है। वैकल्पिक रूप से समस्याग्रस्त वर्णों को मैन्युअल रूप से पहले NA में बदलना एक विकल्प है। आपकी विशेष समस्या के लिए, taRifx::destringबस यही करता है। इस तरह अगर आपको अपने कार्य से बाहर कुछ और अप्रत्याशित चेतावनी मिलती है, तो इसे दबाया नहीं जाएगा।

> library(taRifx)
> x <- as.numeric(c("1", "2", "X"))
Warning message:
NAs introduced by coercion 
> y <- destring(c("1", "2", "X"))
> y
[1]  1  2 NA
> x
[1]  1  2 NA

3
मैं जानता हूँ कि यह एक पुरानी धागा है और destringसेशन के उदाहरण के लिए पूरी तरह से काम करता है, लेकिन जो भविष्य में इस धागे में देखता है किसी के लिए भी एक चेतावनी है कि है destringसे काम करता है अलग ढंग से as.numericजब लक्ष्य स्ट्रिंग स्ट्रिंग और संख्यात्मक का एक मिश्रण है: यह है कि, destring("x1")देता है 1लेकिन as.numeric("x1")देता हैNA
20

26

सामान्य दमन चेतावनी में सबसे अच्छा समाधान नहीं है क्योंकि आप कुछ अनपेक्षित इनपुट प्रदान किए जाने पर चेतावनी दे सकते हैं।
नीचे समाधान डेटा प्रकार रूपांतरण के दौरान सिर्फ NA बनाए रखने के लिए आवरण है। किसी भी पैकेज की आवश्यकता नहीं है

as.num = function(x, na.strings = "NA") {
    stopifnot(is.character(x))
    na = x %in% na.strings
    x[na] = 0
    x = as.numeric(x)
    x[na] = NA_real_
    x
}
as.num(c("1", "2", "X"), na.strings="X")
#[1]  1  2 NA

4
यह सबसे अच्छा जवाब है। उपयोग करना suppressWarnings()आम तौर पर एक बुरा विचार है, क्योंकि हमें कभी-कभी उन चेतावनियों को देखने की आवश्यकता होती है।
keberwein

0

मैंने उस मामले के लिए jangorecki फ़ंक्शन को थोड़ा संशोधित किया है, जहां हमारे पास विभिन्न प्रकार के मान हो सकते हैं जिन्हें किसी संख्या में परिवर्तित नहीं किया जा सकता है। मेरे फ़ंक्शन में, एक टेम्पलेट खोज की जाती है और यदि टेम्पलेट नहीं मिला है, तो FALSE वापस आ जाता है! Gperl से पहले, इसका मतलब है कि हमें उन वेक्टर तत्वों की आवश्यकता है जो टेम्पलेट से मेल नहीं खाते हैं। बाकी as.numफ़ंक्शन के समान है । उदाहरण:

as.num.pattern <- function(x, pattern){
  stopifnot(is.character(x))
  na = !grepl(pattern, x)
  x[na] = -Inf
  x = as.numeric(x)
  x[na] = NA_real_
  x
}

as.num.pattern(c('1', '2', '3.43', 'char1', 'test2', 'other3', '23/40', '23, 54 cm.'))

[1] 1.00 2.00 3.43   NA   NA   NA   NA   NA
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.