ラベル IDGROUP の投稿を表示しています。 すべての投稿を表示
ラベル IDGROUP の投稿を表示しています。 すべての投稿を表示

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」と書いてください。




2015年7月28日火曜日

MEANSまたはSUMMARYプロシジャで使えるIDGROUPオプションの紹介


最近のお気に入りオプションなので紹介したいと思います。

サンプルデータ
data DT1;
input A B$;
cards;
2 aa
1 bb
3 cc
2 dd
. ee
;

サンプルに対して以下のプログラムを実行すると、、
proc summary data=DT1;
   output out=OUT1 idgroup( max(A) out[5] (A B)= );
run;

なんか横一行のデータが出来ました。

IDGROUPオプションの中に注目してみましょう。
max(A) out[5] (A B)=」 で変数Aが大きい順に行を並べ、上位5行のAとBの値をそれぞれ横に転置して表示するようなイメージです。

大きい順で同値がある場合(今回の例では、1行目と4行目のAが両方2)、オブザベーションの並び順で参照していきます(1行目、4行目の順で参照していく)。


注意点1
上の例で「max(A)」だけだとAが欠損値のオブザベーションは選択されません(今回の例では5行目)
欠損値のやつも引っ張ってきたい場合、以下の通りmissingオプションを追加します。

proc summary data=DT1;
   output out=OUT1 idgroup( max(A) missing out[5] (A B)= );
run;

また「min(A)」とすれば変数Aが小さい順になります。


注意点2
制限として1つの変数につき横に並べられるのは100個までのようです。