2017年2月28日火曜日

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




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


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で行う例です。
集計対象が0オブザベーションの場合、今回紹介するオプションは機能しません。
※その他、注意点についても記事の下の方で紹介しています。

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」と出ずに欠損値で出ます。
これはまぁしょうがないかーって感じです。

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


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


0 件のコメント:

コメントを投稿