2013-04-18 53 views
11

Eksik değerler türlerini belirtmek istiyorum. Farklı türlerde kayıplara sahip veriye sahibim ve bu değerleri R'de eksik olarak kodlamaya çalışıyorum ama aralarında hala ayrım yapabileceğim bir çözüm arıyorum. Farklı türlerde eksik değerleri (NA) belirtme

, ben şöyle bazı verileri, şimdi iki tablo yaparsanız

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 

benim eksik değerleri ("Don't know/Not sure","Unknown","Refused" ve 77, 88, 99) düzenli veri olarak dahil edilmiştir sahip

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 

ve

Say
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 

Şimdi üç faktör düzeyinikodlayın <NA>

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

içineve kaldırmak boş seviyeleri

df$a <- factor(df$a) 

ve aynı 77, 88, ve 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 

Şimdi eksik kategoriler NA içine yeniden kodlanmasına olan sayısal değerler ile yapılır ancak hepsi bir araya toplanmışlar. Bir şeyi eksik olarak çözmek için bir yol var mı, ancak orijinal değerlerini koru? R'nin "Don't know/Not sure","Unknown","Refused" ve 77, 88, 99 numaralı iş parçacığını eksik olarak görmesini istiyorum, ancak yine de değişkendeki bilgilere sahip olmak istiyorum.

+0

Değer eksikse true değerini koruyacak olan 'df' adlı bir başka sütun eklenmeye ne dersiniz? veya 'isNA' sütunu doğrudan 'NA' ve' 0' tutabilir. Kodunuzun geri kalanına bağlı. – Nishanth

+0

Bu uygun bir şekilde çalışır, ancak daha fazla bir çözüm, daha sonra, işaret ettiğim gibi, kodumun geri kalanıyla * sorunsuz bir şekilde * çalışacak bir çözümdür. Bir örnekte göstermek ister misiniz? –

+0

Kodun geri kalanındaki etkiyi tahmin etmek zordur. belki de "DOĞRU Bilmiyorum/Emin değilim", "Bilinmeyen", "Reddedildi" için "TRUE" değerini döndüren "my.is.na" ifadesini kullanabileceğiniz kendi "my.table" ı yazabilir misiniz? – Nishanth

cevap

5

Eğer NA bilgiyi kodlamak nereye örneğin yeni sütunlar oluşturabilirsiniz, özgün değerleri korumak için:

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)) 

Sonra böyle bir şey yapabilirsiniz:

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

Diğer bir seçenek olmadan Yeni sütunlar oluşturmak, exclude seçeneğini kullanmak, istenen değerleri NULL olarak ayarlamak, (eksik değerlerden farklı)

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 

"Eksik değerler" inizi gruplamak ve bunları programınızın geri kalanında kullanmak için bazı global sabitleri tanımlayabilirsiniz (hatta tekrar verilmez). Böyle bir şey:

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

Soruma cevap verdiğiniz için teşekkür ederiz. 'Exclude' seçeneğini bilmiyordum. Bu ilginç bir çözüm. Yine de R'nin sadece bir eksik değer kategorisine sahip olduğuna şaşırdım. –

+2

@EricFail R bir eksik temel olarak mantıksal bir değerdir ancak farklı türlere de sahip olabilir: 'NA_integer_, NA_real_, NA_complex_ ve NA_character_'. Düzenlememi "global" bir çözüm için görebilirsiniz. – agstudy

+8

Kesinlikle, bunlar (hepsi) eksikler değildir. "Bilmiyorum" eksik değil, geçerli bir cevap kategorisidir ve çoğu durumda böyle davranılmalıdır. "Reddedildi" de bilgi içerir, oysa "Bilinmeyen" muhtemelen büyük bir kayıptır. Bu üç alt kategoriyle ek bir sütun oluşturabilir ve gerektiğinde, istatistiksel olarak farklı olmayan istatistiksel teknikler kullanırken NA'ya başvurabilirim. –

18

Bildiğim kadarıyla, taban R farklı NA türlerini işlemek için dahili bir yol yoktur. (editör: O yapar:. NA_integer_, NA_real_, NA_complex_ ve NA_character?base::NA bakın.)

Tek seçenek "memisc" Örneğin yapar bir paket kullanmaktır. Biraz fazladan iş var ama aradığın şeyi yapıyor gibi görünüyor.

İlk olarak, veriler:

İşte bir örnek. Veri kümesinde oldukça önemli değişiklikler yapacağımız için bir kopya oluşturdum ve bir yedeğiniz olması her zaman güzel.

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 

edelim faktör değişkeni "a":

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)) 

Yük "memisc" kitaplığı:

library(memisc) 

Şimdi, içeri item s "a" ve "b" değişkenleri dönüştürmek "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)) 

Bunu yaparak, biz yeni bir veri tipine sahip olmak. Aşağıdaki karşılaştırın: tüm orijinal bilgileri korurken

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 

Biz, açıkladığınız şekilde davrandığını tablolar oluşturmak için bu bilgileri kullanabilirsiniz.

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 

Eksik veriler içeren sayısal sütun için tablolar aynı şekilde davranır.

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 

bir bonus olarak, tesisin güzel codebook s oluşturmak için olsun:

> 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 

Ancak, ben de size @ Maxim.K Hangi konuda gelen the comment okumak önerirsin gerçekten eksik değerleri oluşturur.

+1

+1 çok iyi bir cevap! "Include.missings" ifadesini kullandığınızda "*" yi seviyorum. – agstudy

+0

@agstudy de dikkat çekerken, ayrıntılı bir yanıt için teşekkür ederiz. –

+0

+1 gerçekten detaylı, güzel. R'nin farklı NA türlerini işlemek için bir yolu var, ancak bunu kullanıp kullanamayacağınızı bilmiyorum. '' Sayısal '(c (1,2, NA)) 'olan' 'sayısal'' ve 'sınıfı (c (" a "," b ", NA))' 'yi' 'yapmak için yapmalıdır. karakteri "'? –

3

sonra NA, Inf, -Inf ve NaN farklı eksik değerler için kullanılabilecek sayısal değerlere sadık istekli iseniz. Bir daha anlamlı bir şekilde görüntüler ve hatta özel bir sınıf oluşturmak ama bu bile olmadan bu verileri bölmek açacak özel baskı fonksiyonu olabilir

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

: Daha sonra onları ve normal değerler arasında ayrım yapmak is.finite kullanabilirsiniz sonlu ve çoklu sonlu olmayan değerlere.

İlgili konular