2017年2月28日火曜日

頻度集計で存在しない水準値を0件として出したい【PROC TABULATE編】



頻度集計で存在しない水準値を0件として出したい【PROC MEANS編】の続き。


PROC TABULATEでも0件の水準を出すことができます。
今回使用するサンプルデータは前回と一緒ですが、あらためて以下に載せておきます。

*** サンプルデータ作成 ;
data DT1;
input NO$ YN SEX;
cards;
001 1 2
002 1 2
;

YN…何かの有無(0=無、1=有)
SEX…性別(1=男、2=女)




*** FORMAT作成 ;
proc format;
   value _YN
   0 = "無"
   1 = "有"
   ;
   value _SEX
   1 = "男"
   2 = "女"
   ;
run;


以下がYNとSEXの頻度集計をPROC TABULATEで行う例です。

proc tabulate data=DT1;
   class YN SEX        /  missing preloadfmt;
   table (YN SEX) , n  /  printmiss  misstext="0";
   format YN _YN. SEX _SEX.;
run;



preloadfmt」「printmiss」で変数に割り当てたフォーマットを使って、0件の水準も出力されるようにしています。
0件の場合の表示内容を「misstext=」で指定します。今回は「"0"」と表示するようにしています。

ちなみにclassステートメントに「missing」をつけているのは以下データステップ100万回で解説されている落とし穴予防の為です。
means summaryプロシジャのclassステートメント指定変数の欠損値には気を付けてって話


もう1つ注意ですが、
0件の水準を出すようにした結果をSASデータセットに出力すると、、
ods output Table=OUT1;
proc tabulate data=DT1;
   class YN SEX       /  missing preloadfmt;
   table (YN SEX) , n /  printmiss misstext="0";
   format YN _YN. SEX _SEX.;
run;
ods output close;

proc print data=OUT1 noobs;
   var YN SEX N;
run;


misstextオプションが効いてないのか、0件の水準は出るけど、「0」と出ずに欠損値で出ます。
これはまぁしょうがないかーって感じです。

ただ頻度集計・クロス集計・要約統計量の計算など、応用範囲広いのでMEANSやFREQよりこっち使うほうがいい場合もあるので是非TABULATEプロシジャを取り入れてみましょう。

以上、
PROC TABULATEの結果はデータセットに出力できる。
でちょっと触れたTABULATEを使った便利な機能の紹介でした。

0 件のコメント:

コメントを投稿