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

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

SASによる解析:TRANSPOSEプロシジャを用いた転置

先日、個人的にSASでとあるデータの解析を行っている際に、ある変数列に含まれるデータを新たな変数列とし、別な変数列(ID)の値ごとに行とするという作業がありました。その時に使ったのが今回まとめるtransposeプロシジャです。

転置に関することなので、ある程度の線形代数に関する知識は前提とはなっていますがそれほど高度な話は必要ないかなと思います。

 

SASでのデータセットの転置について

SASでのデータの転置は主には以下のものを用いた方法があります。

今回はこの中でも一番メジャーだと思われる、transposeプロシジャでの転置の方法についてまとめたいと思います。なお他の二つについては気が向いたときにでも追記しておきます。

TRANSPOSEプロシジャ

基本的に転置というと行列の(i, j)要素を(j, i)要素にする変換のことですが、tarnsposeプロシジャではそういった単純な転置だけでなく、オプションを指定することで複雑な操作が可能になっています。基本的な構文は以下の通り。

f:id:NorihiroSuzuki:20210930222110p:plain

 

このステートメントで転置元となるデータセットの指定を行います。

out=(新規データセット名)とすることで、転置作業を行った後のデータセットを保存します。

varステートメントでは、転置を行う変数を指定します。仮にこのステートメントを省略した場合には、別のステートメントに記述されていない全ての入力データセットの数値変数を転置対象とします。

byステートメントで指定された変数に含まれる値ごとに転置の作業を行います。

 

 

あとはステートメントとオプションを弄っていくだけになりますが、ここは実際に具体例とともに見て行った方がわかりやすいので具体例を見ていこうと思います。転置するデータセットは下図。

f:id:NorihiroSuzuki:20210930223400p:plain

データの作成コードは以下

data sample;
    input ID Gender$ weight height;
cards; 
1 M 72 172
2 M 65 178
3 W 43 154 
4 M 68 171
5 W 47 156
6 M 81 185
;
run;

 

例1

まずは最も単純な次のコードを考えてみます。

proc transpose data=sample out=N1;
run;

ここで指定したのは元のデータセット名と転置後のデータセット名だけです。この結果は次の通り。

f:id:NorihiroSuzuki:20210930223942p:plain

varステートメントは序盤にも書いた通り、省略された場合には他のステートメントに記述されていない、かつ、数値変数を転置対象とします。つまり今回の場合であればGenderという列が文字変数だったのでそれ以外の全ての列が転置対象となったわけです。またIDステートメントの指定を何にも行っていないため、変数名は自動的に上記のように割り当てが行われます。

 

例2

次にbyステートメントをIDとした場合のコードを見てみます。

proc transpose data=sample out=N2;
    by ID;
run;

これを実行して得られたデータセットは次の通り。

f:id:NorihiroSuzuki:20210930225556p:plain

この例ではIDの値ごとに転置作業が行われます。またvarステートメントで指定がされる変数は今回の場合、byステートメントで指定されたID、文字変数であったGenderを除いたweight, heightになります。

 

例3

最後に以下のようなデータセットでの転置の例を紹介します。ここで目的とするのはランクを列の変数とし、各行を地域とします。

f:id:NorihiroSuzuki:20220227171704p:plain

作成、転置コードはこちら

data sample2;
    input area$ rank Item$;
cards; 
東京 1 A
東京 2 B
東京 3 C
大阪 1 C
大阪 2 A
大阪 3 B
横浜 1 A
横浜 2 C
横浜 3 B
;
run;

proc print data=sample2;
run;
proc sort data=sample2;
 by area;
run;
proc transpose data=sample2 out=N3;
    by area;
    var Item;
    ID rank;
run;
proc print data=N3;
run;

 

実行結果はこれ

f:id:NorihiroSuzuki:20220227171741p:plain

この注意点としては、byステートメントで指定する変数をsortすることです。上記のようにIDステートメントでrank変数を指定することでそれが新たな変数列となりました。そしてbyステートメントで指定された地域ごとにランキングが作成されています。

 

補足

より詳細に知りたい方はこちらの公式のヘルプをどうぞ

documentation.sas.com