医療統計学を学ぶ大学生のブログ

医療統計学、因果推論を専攻しています。R, SASユーザーです。

SASによる解析:横結合

今回はSASのデータハンドリングのうち横結合に絞ってまとめます。

 

MERGEステートメントでの横結合

mergeステートメントの基本的な構文は以下の通り。

f:id:NorihiroSuzuki:20210924152257p:plain

 

mergeステートメントで横結合を行う際には、結合するデータセットとキーとなる変数が必要です。例えば以下の二つのデータセットをIDをキー変数として、横に結合してみます。

f:id:NorihiroSuzuki:20210924153838p:plain

f:id:NorihiroSuzuki:20210924153903p:plain

するとこのようなデータセットが作成されます。

f:id:NorihiroSuzuki:20210924153939p:plain

一応キー変数がなくても結合するデータセットさえあれば、横結合が行われます。その際には上詰めでの横結合が行われます。(今回の例であればキー変数を指定しなくても同じ結果が得られる。)

 

次に同一の変数列があるときの動作を確認してみます。以下のようにx, yという共通の列を持ったデータセットをキー変数をIDとして横結合してみます。

f:id:NorihiroSuzuki:20210924160433p:plain

f:id:NorihiroSuzuki:20210924160508p:plain

この同じ変数列がある場合に注意が必要なのは、mergeステートメントで記述するデータセット(結合前)の順番です。同じ変数列がある場合、最初に記述したデータセットの変数列は、それ以降に記述したデータセットに含まれる同一の変数列の値で上書きが行われます。今回は上の2つのデータセットのうち前者を先に記述したため、そのx, yの列が塗り替えられ、次のように結合が行われます。

f:id:NorihiroSuzuki:20210924161657p:plain

そのためできる限り同一の変数名にしないほうがいいのかなと個人的には思います。

 

行数が異なる場合の動き

キー変数の値が一致する場合には上記のように横にデータが結合されましたが、これは横結合するデータセットの行数が同一である場合のみの紹介でした。次に同一のキー変数を持つが、行数が異なる以下のようなデータセットの結合を見てみます。

f:id:NorihiroSuzuki:20210924162522p:plain

f:id:NorihiroSuzuki:20210924162535p:plain

これを横結合してみると、

f:id:NorihiroSuzuki:20210924162556p:plain

となります。つまりID(キー変数)が同じ値である場合には、データが複製されて結合が行われます。

 

次にキー変数(ID)が異なる場合の動きを見てみます。

f:id:NorihiroSuzuki:20210924163406p:plain

f:id:NorihiroSuzuki:20210924163425p:plain

上記のデータセットはキー変数となるIDが異なります。前者のデータセットに含まれるIDは1, 2, 3、後者には1, 3, 4が含まれています。この状態でキー変数をIDとして横結合を行うと次のようなデータセットが作成されます。

f:id:NorihiroSuzuki:20210924163452p:plain

キー変数が同一の値を持たないデータセット同士を結合させた場合には、そのオブザベーションには欠損値が補完されます。補完のされ方は縦結合の時と同じく、数値列である場合には「.」が、文字列である場合には空白(ブランク)が代入されます。

 

サンプルコード

data df1;
    input ID x y z;
    cards;
    1 1 2 3
    2 2 4 6
    3 3 6 9
    ;
run;

data df2;
    input ID Gender$ Age;
    cards;
    1 M 20
    2 M 16
    3 W 18
    ;
run;

data df3;
    merge df1 df2;
    by ID;
run;

proc print data=df1;
run;
proc print data=df2;
run;
proc print data=df3;
run;

data df4;
    input  ID x y z;
    cards;
    1 1 2 3
    2 2 4 6
    3 3 6 9
    ;
run;

data df5;
    input  ID x y;
    cards;
    1 3 3
    2 6 6
    3 9 9
    ;
run;

data df6;
    merge df4 df5;
    by ID;
run;

proc print data=df4;
run;
proc print data=df5;
run;
proc print data=df6;
run;

data df7;
    input ID Gender$ Age;
    cards;
    1 M 20
    1 W 24
    2 M 16
    3 W 18
    3 M 17
    3 M 22
    ;
run;

data df8;
    merge df1 df7;
    by ID;
run;

proc print data=df1;
run;
proc print data=df7;
run;
proc print data=df8;
run;

data df9;
    input ID Gender$ y z;
    cards;
    1 M 2 3
    2 W 4 6
    3 M 6 9
    ;
run;
data df10;
    input ID Weight;
    cards;
    1  187
    3  148
    4  172
    ;
run;

data df11;
    merge df9 df10;
    by ID;
run;

proc print data=df9;
run;
proc print data=df10;
run;
proc print data=df11;
run;