Rで比較対象がNAを含む場合の対処(データフレームの条件抽出あれこれ)

↓こんなデータフレームがあって、

> d
     name     club
1    taro baseball
2    jiro football
3  hanako     <NA>
4  ichiro baseball
5 yoshiko   tennis

clubがbaseballの行だけ抽出したい場合、↓こんなコードが最初に思い浮かびました。

d[d$club == "baseball", ]

でも実は、これではうまくいかなくて、↓こんな結果になってしまいます。

> d[d$club == "baseball", ]
     name     club
1    taro baseball
NA   <NA>     <NA>
4  ichiro baseball

"=="による比較の結果、TRUE/FALSEのベクトルが返ってきて、それでデータフレームを引くと、TRUEのところだけ残るという目論見なのですが、ベクトルにNAが混ざっており、その行はNAとして返ってきてしまうので都合が悪いです。

「NAではない」という条件を付け加えると、一応うまくいきます↓

> d[ !is.na(d$club) & d$club == "baseball", ]
    name     club
1   taro baseball
4 ichiro baseball

でもなんか、is.na関数とか使うのもなんだかなあと思っていたら、which関数が使えることに気づきました↓

> d[which(d$club=="baseball"), ]
    name     club
1   taro baseball
4 ichiro baseball

さらにいろいろ検索していると、いかにもそれ用な感じのsubset関数なるものがあることも知りました↓

> subset(d, d$club=="baseball")
    name     club
1   taro baseball
4 ichiro baseball

"=="や"which"でインデックス用のベクトルを作ってからデータフレームを引くというのは常套手段ではあるものの、慣れていない人にはピンと来にくい気もします。(絶対に覚えなきゃいけないやり方だとは思いますが・・・)

その点、subset関数はパッと見 何をやっているか分かりやすい印象がありますね。

コメント

このブログの人気の投稿

Rのグラフで軸の目盛りの刻み幅を変更する方法

Rで繰り返しを含む数列の生成(rep関数、seq関数)

reorderを使ってggplotの棒グラフの並び順を降順にする方法