2017年2月23日木曜日

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


まずは以下のプログラムと結果を見てみましょう。

*** サンプルデータ作成 ;
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 freq data=DT1;
   table YN SEX;
   format YN _YN. SEX _SEX.;
run;


変数YNとSEXの頻度集計をしています。

その際、NYに以下フォーマットを当てています
「0=無」「1=有」

SEXには以下フォーマットを当てています
「1=男」「2=女」

結果を見てみると、「YN=0 (無)」と「SEX=1(男)」の度数が出てませんね。
これは集計対象のデータセットDT1に当該の値が存在しないからです。


PROC FREQでは現状0件の水準を出せないので、MEANSで出してみましょう。

proc means data=DT1 completetypes;
   class YN SEX / preloadfmt missing;
   format YN _YN. SEX _SEX.;
   ways 1;
run;



理屈については以下の記事を見て頂くと理解しやすいと思います。

PROC MEANSの、COMPLETETYPES・PRELOADFMTオプションの紹介
(SAS忘備録)
means(summary)プロシジャのclassステートメントに関連してtypes ways nwayの話
(データステップ100万回)


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


また別の方法として、こちらも以下SASYAMAさんが記事にされてるCLASSDATA=オプションを使うのも良い手だと思います。

水準がデータで揃わずスカスカの集計表に立ち向かう_meansやsummaryのclassdata=とtransposeのid 複数変数を利用して

0 件のコメント:

コメントを投稿