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

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

SASによる解析:縦結合

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

 

縦結合の方法

統計解析ソフトとしてのSASを使う大きなメリットの一つは、データハンドリングが行いやすいことにあります。データの結合には縦結合と横結合がありますが、縦結合には主に以下の二つを用いる方法があります。

この二つはデータセットを縦に結合するという点では同じですが、いくつかの点でそれぞれにメリットデメリットが存在します。その点は各項目で紹介します。

 

SETステートメントでの縦結合

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

f:id:NorihiroSuzuki:20210923163855p:plain

 

具体例として、以下のようにx, y, zという共通の列のみを持つデータセットを二つ作成します。

f:id:NorihiroSuzuki:20210923192227p:plain

f:id:NorihiroSuzuki:20210923192251p:plain

ここでこのデータセットをsetステートメントで結合させると、以下のようになります。

f:id:NorihiroSuzuki:20210923192559p:plain



次に、以下のような二つのデータセットが共通した列のみを持たない場合を考えます。

f:id:NorihiroSuzuki:20210923192227p:plain

f:id:NorihiroSuzuki:20210923194551p:plain

ここで注意が必要なのは、setステートメントで結合処理を行うデータセットの順番です。データセットのフォーマット、順序、変数の長さなどは最初に記述したデータセットが優先されます。そのため変数の長さが異なるといった場合にはLENGTHステートメントで指定を行うといった対応が必要が必要となります。また、どちらかのデータセットにのみしか含まれていない列がある場合には補完されます。この補間方法はその変数列が数値列なのか、数値列なのかによって異なり、前者の場合には「.」、後者の場合には空欄(ブランク)が入ります。

というわけで、上記の二つのデータセットを結合させた例を見てみます。

 

f:id:NorihiroSuzuki:20210923200357p:plain

f:id:NorihiroSuzuki:20210923200445p:plain

 

より詳細なオプションに関してはこちらのヘルプを

support.sas.com

サンプルコード

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

data df2;
    input x y z;
    cards;
    4 8 12
    5 10 15
    ;
run;

data df3;
    set df1 df2;
run;

data df4;
    input Gender$ Age x y z;
    cards;
    M 20 4 8 12
    W 19 5 10 15
    ;
run;

data df5;
    set df1 df4;
run;

data df6;
    set df4 df1;
run;

proc print data=df5;
run;

proc print data=df6;
run;

APPENDプロシジャでの縦結合

appendプロシジャは、setステートメントと比較して処理が高速です。そのため大規模なデートセットで結合処理を行う場合にはこちらを使うほうがより効率的です。

ただ結合元になるデータセット(ベースデータセット)に含まれない変数列が、付け加えるデータセットにある場合にはデータの結合が行われません。例えば下記のデータを、上にあるデータをベースデータセットとして縦結合を行おうとしてみます。

f:id:NorihiroSuzuki:20210923192227p:plain

f:id:NorihiroSuzuki:20210923194551p:plain

するとこういったエラーが表示されて、処理が行われません。

f:id:NorihiroSuzuki:20210923203916p:plain

 

そこでベースデータセットと、下にくっつけるデータセットを逆にしてみると、

f:id:NorihiroSuzuki:20210923203830p:plain

となり、結合が行われました。

 

また、setステートメントではなくappendプロシジャを使うメリットの一つは、ベースデータセットが空データであっても追加が可能である点です。つまりからのデータセットがベースとなる場合には、追加のデータセットがコピーされる形になっています。

 

appendプロシジャの詳細についてはこちら

documentation.sas.com

サンプルコード

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

data df2;
    input Gender$ Age x y z;
    cards;
    M 20 4 8 12
    W 19 5 10 15
    ;
run;

proc append base=df1 data=df2;
run;

proc print data=df1;
run;

proc append base=Appenddata data=df2;
run;

proc append base=Appenddata data=df1;
run;


proc print data=Appenddata;
run;