Stataでデータセット結合:あなたが探しているのは「merge m:m」?それとも「joinby」?
二つのデータセットを、ある変数をkeyとして横方向で結合したい場合、多いと思います。
このkeyがそれぞれのデータセットでunique(被りがない)なら、普段通り、merge 1:1
を使えば問題ありません。
また、一方のデータセットはkeyとなる変数がuniqueになっていて、もう一方のデータセットではkey変数に被りがある場合(例えば、村レベルのデータセットに、家計レベルのデータセットを村IDで結合)、merge 1:m
, merge m:1
、もしくはkey変数に被りがあるデータセットの形を変えてmerge 1:1
してしまう、どの方法でもうまくいくかと思います。
問題が発生するのが、二つのデータセット両方でkey変数がuniqueになっていない時。
例えば、村IDが振られている家計レベルのデータについて、同じ村の中で家計を総当たりで結合したいとします。
その時、データセットの形が各村について家計がlong型ではいっているものを、そのまま結合に使いたいとすると、選択肢となるコマンドは merge m:m
と joinby
です(データセットの形を変えて、merge 1:1
などに落とし込む方法もありますが)。
この二つのコマンド、挙動が全く異なります。
この(総当たりでマッチしたい)時、正解は joinby
です。
merge m:m
では求めている結果を返してくれません。
実際にどんな感じになるか見てみましょう。 例えば、ここでは次のような仮想データを考えます。
data1
id_village | household |
---|---|
1 | A |
1 | B |
2 | A |
2 | B |
data2
id_village | household_2 |
---|---|
1 | A |
1 | B |
2 | A |
2 | B |
この二つのデータをid_village
で横方向で結合すると、
merge m:m id_village using data2
は次のデータを返します:
id_village | household | household_2 |
---|---|---|
1 | A | A |
1 | B | B |
2 | A | A |
2 | B | B |
つまり、key変数の値がuniqueでない時、それぞれのkey変数の値について、上からマッチした順に上から結合していくというものになります(なので、元のデータでの行の順番によって結果が異なります)。 ここから分かるように、総当たりでは結合してくれません。
一方、joinby
だと、
joinby id_village using data2
とすると、次のデータを返します:
id_village | household | household_2 |
---|---|---|
1 | A | A |
1 | A | B |
1 | B | B |
1 | B | A |
2 | A | B |
2 | A | A |
2 | B | B |
2 | B | A |
同じkey変数の値内で、household
と househould_2
が総当たりで結合されています。
ただし、merge
が結合できた行・できなかった行を新たな変数 (_merge
) で明示してくれる一方、joinby
はデフォルトではそうした変数を新たに作りません。
また、data1
, data2
どちらかにしかない id_village
の観測値は、マッチされないため削除されてしまうことにも注意です( merge
では「マッチされない」ということが明示されます)。
ここからも分かる通り、merge m:m
は求めているものと異なる挙動をしている場合が多く、かつ結果が元のデータの行の順番に依存している、危険なコマンドなため、できるだけ使わない方が良いそうです。