Rでデータハンドリングする時,便利なmerge関数。
簡単に言うと,二種類のデータがあったら,キー変数を使って名寄せしてくれるわけです。例えば事前調査,事後調査をして別のファイルに保存していたけど,分析は前後で対応をつけてやりたい。学籍番号か何かでラベルはつけてあるけど,ソートしてマッチングして・・・というのは手作業では大変ですな。それを自動でやってくれるんです,こんなにありがたいことはない。
ということで,まさに上のような状態で分析を今から始めようとしていて,データセットA,データセットBそれぞれに200人近いデータが入っていたのです。それを分析するために結合しようとして,
total <- merge(dataA,dataB,by=”キー変数”)
とするだけでよかった・・・はず。
でも,出来上がったデータセットはなぜか500人近いデータになっていてびっくりw
完全にバラバラなデータであっても,400人にしかならないはずなのに,どこからか100人分わいて出てきている。これはどういうことだろう・・・と,この三日ほどなやんでおりました。
が,先ほど色々考えてやっと解決。
要は,キー変数に欠損値が複数ある場合,が問題だった。
データセットAのキー変数(例えばID)が,1,4, 3, NA, NA,とあって,データセットBに同じく1,3,5,NA,NA,NAとあったとします。この場合,両者にある1,3のデータはマージしてほしいんだけど,5は違うので,残すか消すかですね。5を保存するかどうかはオプションで指定します。保存してほしかったら,all=Tというオプションを着けます。
問題は,NAなのです。欠損値なので,このレコードは合わせようがない。もっとも,分析には一部使えるので,マージするだけするか,というところですが,複数のNAがどことマッチするか分からない!
そこでRは,その分を水増しするわけです。
仮にデータセットAのNAを順にNA_a1,NA_a2,データセットBのNAを順にNA_b1,NA_b2,NA_b3とすると,どうやらRは,
NA_a1=NA_b1
NA_a1=NA_b2
NA_a1=NA_b3
NA_a2=NA_b1
NA_a2=NA_b2
NA_a2=NA_b3
と「水増し」してしまうようです。
なんだこりゃ,と思われるかもしれないけど,Rの立場から考えると(!)これは合理的な配慮ではあるかな,と。
それが嫌なら,事前にキー変数の欠損値に別の数字を割り付けておくかなんかして,確実にずれるようにすれば問題回避できます。
やー,とにかくこれで謎が明らかになったぞ。
やれやれ。
追記)@R_Linux先生から素敵なお知らせ。merge関数のincomparables引数にNAを指定すればこの問題を回避できます。使い方は
merge(dataA,dataB,by=”キー変数”,incomparables=NA)
とするだけです。
こんなに簡単な回避方法があったとは。自分は別でかぶらないように着けたID変数をキー変数のNAに代入して回避してましたよ。
自らの無能さを晒すために,消さずにおいておきます。
教えてくださりありがとうございました!