13

欠損値の種類を指定することに興味があります。さまざまな種類の欠損値を持つデータがあり、これらの値を R で欠損値としてコーディングしようとしていますが、それらを区別できる解決策を探しています。

このようなデータがあるとします。

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

ここで 2 つのテーブルを作成すると、欠損値 ("Don't know/Not sure","Unknown","Refused"および77, 88, 99) が通常のデータとして含まれます。

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

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

ここで、3 つの因子レベル"Don't know/Not sure","Unknown","Refused"を次のように再コード化します。<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が、それらはすべてまとめられています。何かを欠落として再コード化する方法はありますが、元の値は保持されますか? R をスレッド"Don't know/Not sure","Unknown","Refused"化し77, 88, 99て行方不明にしたいのですが、変数に情報を保持できるようにしたいと考えています。

4

3 に答える 3

20

私の知る限り、ベース R にはさまざまな型を処理する組み込みの方法がありませんNA(エディタ:NA_integer_NA_real_NA_complex_および を行いNA_characterます。 を参照してください?base::NA。)

1 つのオプションは、「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

変数 "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))

「memisc」ライブラリをロードします。

library(memisc)

ここで、変数 "a" と "b" をitem"memisc" の s に変換します。

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

おまけとして、nice を生成する機能を利用できます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 からのコメントを読むこともお勧めします。

于 2013-04-21T10:55:53.940 に答える
5

元の値を保持するには、次のように NA 情報をコーディングする新しい列を作成できます。

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

次に、次のようなことができます:

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

新しい列を作成しない別のオプションは、excludeこのようなオプションを使用して、不要な値を NULL に設定することです (欠損値とは異なります)。

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")
于 2013-04-18T06:46:20.113 に答える
5

数値に固執する場合はNAInf、 、-Inf、およびNaNをさまざまな欠損値に使用できます。is.finite次に、それらと通常の値を区別するために使用できます。

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

is.infinite、ここis.nanでもis.na役立ちます。

それらをより意味のある方法で表示したり、特別なクラスを作成したりする特別な印刷機能を使用することもできますが、それがなくても、上記はデータを有限値と複数の非有限値に分割します。

于 2013-04-24T15:07:14.490 に答える