2013-04-18 13 views
11

मुझे गुम मूल्यों के प्रकार निर्दिष्ट करने में दिलचस्पी है। मेरे पास डेटा है जिसमें विभिन्न प्रकार के गायब हैं और मैं इन मानों को आर में गायब होने की कोशिश कर रहा हूं, लेकिन मैं एक समाधान की तलाश में हूं, मैं अभी भी उनके बीच अंतर कर सकता हूं।विभिन्न प्रकार के लापता मान निर्दिष्ट करें (एनएएस)

,

table(df$a,df$g) 
#      C K M Y 
# Blue    0 0 1 2 
# Don't know/Not sure 0 0 0 1 
# Green    2 1 2 0 
# Red     1 0 0 3 
# Refused    1 1 2 0 
# Unknown    0 0 3 0 

और

मैं कुछ डेटा है कि इस तरह दिखता है,

set.seed(667) 
df <- data.frame(a = sample(c("Don't know/Not sure","Unknown","Refused","Blue", "Red", "Green"), 20, rep=TRUE), b = sample(c(1, 2, 3, 77, 88, 99), 10, rep=TRUE), f = round(rnorm(n=10, mean=.90, sd=.08), digits = 2), g = sample(c("C","M","Y","K"), 10, rep=TRUE)); df 
#      a b f g 
# 1    Unknown 2 0.78 M 
# 2    Refused 2 0.87 M 
# 3     Red 77 0.82 Y 
# 4     Red 99 0.78 Y 
# 5    Green 77 0.97 M 
# 6    Green 3 0.99 K 
# 7     Red 3 0.99 Y 
# 8    Green 88 0.84 C 
# 9    Unknown 99 1.08 M 
# 10    Refused 99 0.81 C 
# 11    Blue 2 0.78 M 
# 12    Green 2 0.87 M 
# 13    Blue 77 0.82 Y 
# 14 Don't know/Not sure 99 0.78 Y 
# 15    Unknown 77 0.97 M 
# 16    Refused 3 0.99 K 
# 17    Blue 3 0.99 Y 
# 18    Green 88 0.84 C 
# 19    Refused 99 1.08 M 
# 20     Red 99 0.81 C 

मैं अब दो तालिकाओं करते हैं तो मेरी लापता मूल्यों ("Don't know/Not sure","Unknown","Refused" और 77, 88, 99) नियमित रूप से डेटा के रूप में शामिल किए गए हैं है कहो

table(df$b,df$g) 
# C K M Y 
# 2 0 0 4 0 
# 3 0 2 0 2 
# 77 0 0 2 2 
# 88 2 0 0 0 
# 99 2 0 2 2 

अब मैं तीन कारक स्तररिकोड करता हूं <NA>

is.na(df[,c("a")]) <- df[,c("a")]=="Don't know/Not sure"|df[,c("a")]=="Unknown"|df[,c("a")]=="Refused" 

में ६६६४२५३२१० और निकालने के खाली स्तरों

df$a <- factor(df$a) 

और एक ही संख्यात्मक मान 77, 88, और 99

is.na(df) <- df=="77"|df=="88"|df=="99" 

table(df$a, df$g, useNA = "always")  
#  C K M Y <NA> 
# Blue 0 0 1 2 0 
# Green 2 1 2 0 0 
# Red 1 0 0 3 0 
# <NA> 1 1 5 1 0 

table(df$b,df$g, useNA = "always") 
#  C K M Y <NA> 
# 2 0 0 4 0 0 
# 3 0 2 0 2 0 
# <NA> 4 0 4 4 0 

अब लापता श्रेणियों NA में पुनःकूटित कर रहे हैं के साथ किया जाता है, लेकिन वे सभी एक साथ लम्बे हुए हैं। क्या गायब होने के रूप में कुछ रिकोड करने का कोई तरीका है, लेकिन मूल मानों को बनाए रखें? मैं आर 0 धागा "Don't know/Not sure","Unknown","Refused" और 77, 88, 99 लापता होने के लिए चाहता हूं, लेकिन मैं अभी भी चर में जानकारी प्राप्त करने में सक्षम होना चाहता हूं।

+0

'isf' नामक 'df' में एक और कॉलम जोड़ने के बारे में, यदि मूल्य गुम है तो सत्य होगा? या 'isNA' कॉलम सीधे' NA' और '0' पकड़ सकता है। यह आपके शेष कोड पर निर्भर करता है। – Nishanth

+0

यह ठीक से काम करेगा, लेकिन यह एक समाधान है जो एक समाधान है जो * मेरे शेष कोड के साथ * निर्बाध * काम करेगा-जैसा कि आप भी इंगित करते हैं। क्या आप इसे एक उदाहरण में प्रदर्शित करना चाहते हैं? –

+0

शेष कोड पर प्रभाव की भविष्यवाणी करना मुश्किल है। हो सकता है कि आप अपना 'my.table' लिख सकें जो 'my.is.na' का उपयोग करता है जो" पता नहीं/सुनिश्चित नहीं है "," अज्ञात "," अस्वीकार "के लिए' TRUE' 'देता है – Nishanth

उत्तर

5

मूल मूल्यों को बनाए रखने के लिए, आप उदाहरण के लिए, जहां एनए जानकारी कोड नए स्तंभ बना सकते हैं: बिना

table(df$b.na , df$g) 
    C K M Y 
    2 0 0 4 0 
    3 0 2 0 2 

एक अन्य विकल्प:

df <- transform(df,b.na = ifelse(b %in% c('77','88','99'),NA,b)) 
df <- transform(df,a.na = ifelse(a %in% 
         c("Don't know/Not sure","Unknown","Refused"),NA,a)) 

तो फिर तुम कुछ इस तरह कर सकते हैं नए कॉलम बनाने के लिए, exclude विकल्प का उपयोग करना है, गैर वांछित मानों को शून्य पर सेट करने के लिए, (गुम मूल्यों के अलग)

table(df$a,df$g, 
     exclude=c('77','88','99',"Don't know/Not sure","Unknown","Refused")) 
     C K M Y 
    Blue 0 0 1 2 
    Green 2 1 2 0 
    Red 1 0 0 3 

आप अपने "गायब मूल्यों" को समूहित करने के लिए कुछ वैश्विक स्थिरांक (यहां तक ​​कि इसकी अनुशंसा नहीं की जाती है) को परिभाषित कर सकते हैं, और अपने शेष कार्यक्रम में उनका उपयोग कर सकते हैं। कुछ इस तरह:

B_MISSING <- c('77','88','99') 
A_MISSING <- c("Don't know/Not sure","Unknown","Refused") 
+1

मेरे प्रश्न का उत्तर देने के लिए धन्यवाद। मुझे 'बहिष्कृत' विकल्प के बारे में पता नहीं था। यह एक दिलचस्प समाधान है। मैं अभी भी कुछ हद तक हैरान हूं कि आर में केवल एक वर्ग गुम मूल्य है। –

+2

@EricFail R में एक गायब मूल रूप से एक तार्किक मान हैं लेकिन विभिन्न प्रकार भी हो सकते हैं: 'NA_integer_, NA_real_, NA_complex_ और NA_character_'। आप "वैश्विक" समाधान के लिए अपना संपादन देख सकते हैं। – agstudy

+8

कड़ाई से बोलते हुए, ये सभी (सभी) मिसाल नहीं हैं। "पता नहीं" गुम नहीं है, यह एक वैध उत्तर श्रेणी है, और कई मामलों में इस तरह माना जाना चाहिए। "अस्वीकार" में जानकारी भी होती है, जबकि "अज्ञात" शायद एक वास्तविक गायब है। मैं इन तीन उपश्रेणियों के साथ एक अतिरिक्त कॉलम तैयार करूंगा और जब भी मुझे आवश्यकता हो, तब सांख्यिकीय संदर्भों के लिए नियमित एनए का उपयोग करते समय उन्हें संदर्भित करें। –

18

मेरी जानकारी के लिए, आधार आर एक में बनाया रास्ता अलग NA प्रकारों को प्रबंधित करने की जरूरत नहीं है। (संपादक: यह करता है:। NA_integer_, NA_real_, NA_complex_, और NA_character?base::NA देखें।)

एक विकल्प एक पैकेज है जो ऐसा नहीं करता है का उपयोग करने के, उदाहरण के लिए "memisc" है। यह थोड़ा अतिरिक्त काम है, लेकिन ऐसा लगता है कि आप जो खोज रहे हैं।

यहां एक उदाहरण है:

पहला, आपका डेटा। मैंने एक प्रतिलिपि बनाई है क्योंकि हम डेटासेट में कुछ महत्वपूर्ण बदलाव करेंगे, और बैकअप रखना हमेशा अच्छा होता है।

set.seed(667) 
df <- data.frame(a = sample(c("Don't know/Not sure", "Unknown", 
           "Refused", "Blue", "Red", "Green"), 
          20, replace = TRUE), 
       b = sample(c(1, 2, 3, 77, 88, 99), 10, 
          replace = TRUE), 
       f = round(rnorm(n = 10, mean = .90, sd = .08), 
          digits = 2), 
       g = sample(c("C", "M", "Y", "K"), 10, 
          replace = TRUE)) 
df2 <- df 

आइए कारक चर "एक":

df2$a <- factor(df2$a, 
       levels = c("Blue", "Red", "Green", 
          "Don't know/Not sure", 
          "Refused", "Unknown"), 
       labels = c(1, 2, 3, 77, 88, 99)) 

लोड "memisc" पुस्तकालय:

library(memisc) 

अब, में item रों को चर परिवर्तित "एक" और "बी" "memisc":

df2$a <- as.item(as.character(df2$a), 
        labels = structure(c(1, 2, 3, 77, 88, 99), 
            names = c("Blue", "Red", "Green", 
               "Don't know/Not sure", 
               "Refused", "Unknown")), 
        missing.values = c(77, 88, 99)) 
df2$b <- as.item(df2$b, 
       labels = c(1, 2, 3, 77, 88, 99), 
       missing.values = c(77, 88, 99)) 

ऐसा करके, हम एक नया डेटा प्रकार है। निम्नलिखित की तुलना करें:

as.factor(df2$a) 
# [1] <NA> <NA> Red Red Green Green Red Green <NA> <NA> Blue 
# [12] Green Blue <NA> <NA> <NA> Blue Green <NA> Red 
# Levels: Blue Red Green 
as.factor(include.missings(df2$a)) 
# [1] *Unknown    *Refused    Red     
# [4] Red     Green    Green    
# [7] Red     Green    *Unknown    
# [10] *Refused    Blue     Green    
# [13] Blue     *Don't know/Not sure *Unknown    
# [16] *Refused    Blue     Green    
# [19] *Refused    Red     
# Levels: Blue Red Green *Don't know/Not sure *Refused *Unknown 

हम सभी मूल जानकारी को बनाए रखते हुए, जिस तरह से आप का वर्णन व्यवहार कर तालिकाएं बनाने के लिए इस जानकारी का उपयोग कर सकते हैं।

table(as.factor(include.missings(df2$a)), df2$g) 
#      
#      C K M Y 
# Blue     0 0 1 2 
# Red     1 0 0 3 
# Green    2 1 2 0 
# *Don't know/Not sure 0 0 0 1 
# *Refused    1 1 2 0 
# *Unknown    0 0 3 0 
table(as.factor(df2$a), df2$g) 
#   
#   C K M Y 
# Blue 0 0 1 2 
# Red 1 0 0 3 
# Green 2 1 2 0 
table(as.factor(df2$a), df2$g, useNA="always") 
#   
#   C K M Y <NA> 
# Blue 0 0 1 2 0 
# Red 1 0 0 3 0 
# Green 2 1 2 0 0 
# <NA> 1 1 5 1 0 

गायब डेटा वाले संख्यात्मक कॉलम के लिए सारणी एक ही तरीके से व्यवहार करती है।

table(as.factor(include.missings(df2$b)), df2$g) 
#  
#  C K M Y 
# 1 0 0 0 0 
# 2 0 0 4 0 
# 3 0 2 0 2 
# *77 0 0 2 2 
# *88 2 0 0 0 
# *99 2 0 2 2 
table(as.factor(df2$b), df2$g, useNA="always") 
#  
#  C K M Y <NA> 
# 1 0 0 0 0 0 
# 2 0 0 4 0 0 
# 3 0 2 0 2 0 
# <NA> 4 0 4 4 0 

एक बोनस के रूप में, आप सुविधा अच्छा codebook रों उत्पन्न करने के लिए मिलता है:

> codebook(df2$a) 
======================================================================== 

    df2$a 

------------------------------------------------------------------------ 

    Storage mode: character 
    Measurement: nominal 
    Missing values: 77, 88, 99 

      Values and labels N Percent 

    1 'Blue'     3 25.0 15.0 
    2 'Red'     4 33.3 20.0 
    3 'Green'     5 41.7 25.0 
    77 M 'Don't know/Not sure' 1   5.0 
    88 M 'Refused'    4  20.0 
    99 M 'Unknown'    3  15.0 

हालांकि, मैं भी आप @ Maxim.K किस बारे में से the comment पढ़ सुझाव है है वास्तव में गुम मूल्यों का गठन किया।

+1

+1 बहुत अच्छा विस्तृत उत्तर! मुझे 'शामिल' में '*' पसंद है जब 'include.missings' :) – agstudy

+0

एक विस्तृत विस्तृत उत्तर के लिए धन्यवाद, जैसा कि @agstudy भी बताता है। –

+0

+1 वास्तव में विस्तृत, अच्छा। आर के पास विभिन्न एनए प्रकारों को संभालने का एक तरीका है, लेकिन मुझे नहीं पता कि आप इसका उपयोग कर सकते हैं या नहीं। इसे 'कक्षा (सी (1,2, एनए)) करने में सक्षम होने के लिए करना चाहिए, जो '" संख्यात्मक "और' वर्ग (सी ("ए", "बी", एनए) है "जो' ' चरित्र "'? –

3

आप सांख्यिक मानों तो NA, Inf, -Inf, और NaN अलग लापता मूल्यों के लिए इस्तेमाल किया जा सकता करने के लिए छड़ी करने के लिए तैयार कर रहे हैं। इसके बाद आप is.finite उपयोग कर सकते हैं उन्हें और सामान्य मूल्यों के बीच अंतर करना:

> x <- c(NA, Inf, -Inf, NaN, 1) 
> is.finite(x) 
[1] FALSE FALSE FALSE FALSE TRUE 

आप एक विशेष प्रिंट समारोह है कि उन्हें एक और अधिक सार्थक तरीके से प्रदर्शित करता है या यहाँ तक कि एक विशेष वर्ग बनाने लेकिन फिर भी है कि बिना इस डेटा को विभाजित हैं हो सकता था सीमित और कई गैर-सीमित मूल्यों में।

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