R logo

データ整理をしていると、データが抜けていて欠損値になっている事がある。

この時の対処方法いろいろ。

データのインポートと欠損値(NA)の抽出、欠損値行を避けて抽出する方法

例えば、下記のようなデータがあって、いくつか空欄がある。

r-handling-na-1

これをRに取り込むと、

Dat <- read.csv("Data.csv")

空欄部分は時々空欄のまま、時々"NA"として認識される。

r-handling-na-2

 

欠損値の抽出

このデータから、欠損値を抽出するには

Dat[!complete.cases(Dat),]

これだと、下記のように<NA>が入っている6行が抽出される。

r-handling-na-3

これは、空欄として認識されたウェルは欠損値として認識されていないから。

これを避けるためには、データのインポートの段階で、空欄""をNAで置換しておくと良い。

Dat <- read.csv("Data.csv", na.strings=c(""))     # 空欄部分を<NA>に置き換える

そして、

Dat[!complete.cases(Dat),]

で選出すると、

最初の段階では選出されなかった行も<NA>を含む行として認識され、抽出される。

r-handling-na-4

 

欠損値じゃないデータを "which()" を使って抽出する

例えば、上記データの中から、"Revenue" が "9746272" の行を抽出すると、

Dat[Dat&Revenue == 9746272,]

下図のように、1行は求めたい "Revenue == "0746272" だけど、その下に、<NA>という謎の2行がついてくる。

r-handling-na-5

これはなんでかというと、参照列の "Revenue" に <NA> が入っていると、Rはこれも抽出してくるから。

r-handling-na-6

 

Rは1行目から "TRUE" or "False" で検証していって、3行目は "TRUE" だから選出。

もう少し降りて 8行目と44行目に "NA" があるのを見つけると、それも選出する、という感じ。

 

これを防ぎ、本当にほしいデータだけ抽出したい場合には、

which()

関数を挟む。

Dat[which(Dat$Revenue == 9746272),]
which()

関数は、"TRUE" のデータだけを選出する関数。

これを使うと、下記のようにほしいデータだけ抽出できる。

r-handling-na-7

欠損値行を "is.na()" を使って抽出する

 

例えば "Revenue" が <NA> の行を抽出したい場合、

Dat&[Dat$Expenses == NA,]

としちゃうと、下記にように、見事に全てがNAになって返ってくる。

r-handling-na-8

これはなんでかというと、RはNAを他のTRUE/FALSEと比較検討できないから。

 

これを避ける為に、

is.na()

を挟むと良い。

Dat&[is.na(Dat&Expenses),]

r-handling-na-9

目的通り、"Expenses" が <NA> の行だけ抽出できた。

 



 

次回は、欠損値の削除/補完方法について記載予定。

 

 

References

Udemy-English

にほんブログ村 子育てブログ ワーキングマザー育児へ