2015年8月4日火曜日

SUMMARYプロシジャによる楽々転置法



サンプルデータ
data DT1;
input A$ B C$;
cards;
001 10 aa
001 20 bb
001 50 cc
002 . dd
002 100 .
002 200 ee
;






サンプルから、以下のようなデータセットを作りたいとします。
(Aの値毎に各変数値を横に転置しています。)







今回個人的にハマってるSUMMARYプロシジャで色々調べていたら、海外のSAS Global Forumで発表された方法が面白かったので、この方法で転置してみます。
http://support.sas.com/resources/papers/proceedings10/102-2010.pdf


SUMMARYプロシジャのIDGROUPを使った方法
proc sort data=DT1;
   by A;
run;

proc summary data=DT1 ;
   by A;
   output out=OUT1 (drop=_TYPE_ _FREQ_)  idgroup( out[3] (B C)= );
run;


これだけ!
IDGROUPについては以下で紹介しました。
MEANSまたはSUMMARYプロシジャで使えるIDGROUPオプションの紹介

最初、上のリンク記事の例のようにIDGROUPには min(変数) とか max(変数) を書く必要があるのかと思ったらそうでもないんですね!



汎用性をもたせるために、Aのグループ内obs数の最大値を取得して、その数だけ横に並べるようにしたプログラムが以下になります。
proc sql noprint;
   select max(_COUNT) into:_MAX trimmed from
   (select count(*) as _COUNT from DT1 group by A);
quit;

proc sort data=DT1;
   by A;
run;

proc summary data=DT1 ;
   by A;
   output out=OUT2 (drop=_TYPE_ _FREQ_)  idgroup( out[&_MAX] (B C)= );
run;


※ ただし、制限として1つの変数につき横に並べられるのは100個までとなります。
※ 「by A」を「class A」と書くと、合計行が作られてしまうので、必ず「by A」と書いてください。




0 件のコメント:

コメントを投稿