さて、PLANプロシジャは本来、実験計画・割付に使用するプロシジャですが今回は、MEANS(SUMMARRY)プロシジャのCLASSDATA=オプションで指定する水準データセットをproc planで作ってみます。
いま、
data Q_1;
LEVEL_1=1;LEVEL_2='B';FLAG=1;output;
LEVEL_1=1;LEVEL_2='B';FLAG=1;output;
LEVEL_1=2;LEVEL_2='C';FLAG=1;output;
LEVEL_1=3;LEVEL_2='A';FLAG=1;output;
run;
こういうデータセットがあって、LEVEL_1はとりうる値が1-3、LEVEL_2はA-Cだという前提条件があって、以下のように、出現していない水準の組み合わせを0で集計したい場合があるとします。
さて、まずはproc planで、水準の情報を与えて、とりうる組み合わせのフルセットがはいった
データセットを作成します。
proc plan;
factors LEVEL_1=3 LEVEL_2=3 ordered /noprint;
output out=CLDS
LEVEL_2 cvals=('A' 'B' 'C');
run;
quit;
randomステートメントなしのproc planはなんだか斬新というか違和感ありありですが、
上記の結果、生成されるデータセット「CLDS」は
こうなります。3水準×3水準なので9水準がフルセットですね。
そこで後は普通にmeansプロシジャのclassdata=で上記のCLDSを指定すれば
proc means data=Q_1
classdata=CLDS
noprint nway exclusive;
class LEVEL_1 LEVEL_2;
var FLAG;
output out=A_1(drop=_TYPE_ _FREQ_) N=COUNT;
run;
となって完成です。
なおmeans プロシジャのclassdata=についてはまた、いつか改めて説明しますが
classdata=で指定のデータセットとdata=のデータセットのclassステートメントで指定された変数の
長さ、ラベル、フォーマット、インフォーマットが同一でないとエラーになるので
集計したいデータセットにメタデータが定義されている場合は
proc datasets nolist;
modify Q_1;
attrib _all_ informat= format= label='';
quit;
で定義情報をリセットしておくことをお勧めします。
ちなみに、、あえてPLANプロシジャつかわなくて
data CLDS;
do LEVEL_1=1 to 3;
do LEVEL_2='A','B','C';
output;
end;
end;
run;
で、いいので、こっちの方がよいかもしれません。
ただ、現実での実践例が思いつきませんが、ランダムに決定される水準セットによって
集計するような処理を書く場合(どんな場合だ??)、ploc planならスムーズかもしれませんね
(その場合でもデーステップで rand関数で、classデータ作成してやりゃいいんですけどね)
0 件のコメント:
コメントを投稿