読者です 読者をやめる 読者になる 読者になる

欠損値の処理の仕方

R

なぜ書いてないのか分からないけど。is.naを使って処理しよう。

price.test<-price[!is.na(mpg.with.missing)]

あとは&を使ったりして、どうにかできる。と、このままで放置しとくと初心者の人から反感くらいそうなので、もう少し丁寧に載せとこ。

例えば、こんな感じの欠損付きデータが与えられたとする。

 Stmf  Ykrs Stmf Ykrs Stmf Ykrs Stmf Ykrs Stmf Ykrs
66     47     61     36     152     76     80     66     113     66
 52     37     47     24     201     108     68     82     38     18
 -     27     -     52     134     85     24     47     38     25
 -     37     196     88     206     96     24     28     28     14
 -     38     131     111     92     48     82     44     52     27

「-」となっているところは「NA」というものに置換しておく。データを読み込む。上のデータをozone.txtという名前で保存。

ozone<-read.table("ozone.txt",header=TRUE)

上のデータでは奇数番目がstmf、偶数番目がykrsなので、それぞれ読み込む。

stmf.ozone<-c(ozone[,1],ozone[,3],ozone[,5],ozone[,7],ozone[,9])
ykrs.ozone<-c(ozone[,2],ozone[,4],ozone[,6],ozone[,8],ozone[,10])

しかし、このままでは欠損付きであるから、どちらかが欠損となっているものについては省くことにする。

stmf.ozone2<-stmf.ozone[!is.na(stmf.ozone) & !is.na(ykrs.ozone)]
ykrs.ozone2<-ykrs.ozone[!is.na(stmf.ozone) & !is.na(ykrs.ozone)]

こうすれば、欠損を取り除いてデータを解析することができる。

しかし、実際の車の価格のデータを解析するときなどはこのようなことをやっているとデータの数が非常に少なくなってしまう。これでは、データ全体を反映した解析ができたとは言えないので、インターネットで調べるなどして、できるだけ欠損を補うように努力しなければならない。そして、このような欠損の処理を行う。

効率よく欠損値を取り除く

欠損値を取り除くには!is.naをやって「&」で結んで行けばよいのだが、使う説明変数が流動的でかつ多いときには結構な手間になる。そういうときに有効そうな手段。complate.casesという関数を使う。以下のようなデータがあったとする。

x <- c(1,3,2,1,NA,4)
y <- c(2,NA,3,2,5,4)
z <- c(5,3,2,3,2,1)
df <- data.frame(x,y,z)

このようなデータに対して
complate.casesという関数を使ってやると

complete.cases(df)
[1]  TRUE FALSE  TRUE  TRUE FALSE  TRUE

こういう結果が返ってくるので、これをさっき説明したsubset関数に条件として放り投げてやればよい。

dfc <- subset(df, complete.cases(df))
dfc
  x y z
1 1 2 5
3 2 3 2
4 1 2 3
6 4 4 1

また、このような感じでもよい。

dfc2 <- df[complete.cases(df),]
dfc2
  x y z
1 1 2 5
3 2 3 2
4 1 2 3
6 4 4 1

こうすれば、欠損の入っているデータでも処理を割りと簡単にすることができる。

改訂3版 R言語逆引きハンドブック

改訂3版 R言語逆引きハンドブック