Rで比較対象がNAを含む場合の対処(データフレームの条件抽出あれこれ)
↓こんなデータフレームがあって、
clubがbaseballの行だけ抽出したい場合、↓こんなコードが最初に思い浮かびました。
でも実は、これではうまくいかなくて、↓こんな結果になってしまいます。
"=="による比較の結果、TRUE/FALSEのベクトルが返ってきて、それでデータフレームを引くと、TRUEのところだけ残るという目論見なのですが、ベクトルにNAが混ざっており、その行はNAとして返ってきてしまうので都合が悪いです。
「NAではない」という条件を付け加えると、一応うまくいきます↓
でもなんか、is.na関数とか使うのもなんだかなあと思っていたら、which関数が使えることに気づきました↓
さらにいろいろ検索していると、いかにもそれ用な感じのsubset関数なるものがあることも知りました↓
"=="や"which"でインデックス用のベクトルを作ってからデータフレームを引くというのは常套手段ではあるものの、慣れていない人にはピンと来にくい気もします。(絶対に覚えなきゃいけないやり方だとは思いますが・・・)
その点、subset関数はパッと見 何をやっているか分かりやすい印象がありますね。
> 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関数はパッと見 何をやっているか分かりやすい印象がありますね。
コメント
コメントを投稿