merge関数を使うときの注意点

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に代入して回避してましたよ。

 

自らの無能さを晒すために,消さずにおいておきます。

教えてくださりありがとうございました!