2015年6月4日木曜日

TRANSPOSEの2回実行テクニック。


データをtransposeで2度漬けすることによって、1回のtransposeじゃ実現できないデータを作ることができます。

その一例を紹介します。


サンプルデータ

data DT1;
    input NO$ SEQ  A$  B$  C$;
    cards;
001 1 XX AA aa
001 2 YY BB cc
002 1 ZZ CC dd
002 2 WW DD bb
;
run;


やりたい事
変数NOの値が同じオブザベーションを、1つのオブザベーションにまとめたい。
まとめるときの変数名は [元の変数名]_[SEQの値] とする。
たとえば、SEQ=1の変数Aは「A_1」、SEQ=2の変数Aは「A_2」という具合です。





(ちなみに、データの前提条件として、転置する変数A, B, Cはすべて同じ型とします。)


transpose1回目

proc transpose data=DT1  out=DT2;
    var  A B C;
    by  NO SEQ;
    format  A B C;
run;


とりあえず、いったん変数A,B,Cを縦に転置。


transpose2回目

proc transpose data=DT2  out=DT3  delim=_;
    var  COL1;
    by  NO;
    id  _NAME_ SEQ;
    format  SEQ;
run;


by NO」でNOの値ごとに転置し、
id _NAME_ SEQ」と「delim=_」の組み合わせで、転置したときの変数名を [_NAME_の値]_[SEQの値] となるようにしてます。


今回の例、難点としては、
変数達のlengthが、一番大きいやつに合わせられちゃうところですかね。
例えば、各変数のlengthが、以下だった場合、、
A … $5
B … $100
C … $5

転置された変数は、一番lengthの大きい$100に合わせられます。
そのため、ファイル容量もデカくなりがちかも。

メリット・デメリットあるけど、ダイナミックな動きをしてくれるので色んなケースで役に立ってくれます。

0 件のコメント:

コメントを投稿