まずは失敗例から。
失敗例
*** サンプルデータ作成 ; data DT1; input NO$ YN SEX; cards; 001 1 2 002 1 2 ; YN…何かの有無(0=無、1=有) *** FORMAT作成 ; proc format; value _YN 0 = "無" 1 = "有" ; value _SEX 1 = "男" 2 = "女" ; run; proc freq data=DT1; tables YN SEX; format YN _YN. SEX _SEX.; run; |
変数YNとSEXの頻度集計をしています。
その際、YNに以下フォーマットを当てています
「0=無」「1=有」
SEXには以下フォーマットを当てています
「1=男」「2=女」
結果を見てみると、「YN=0 (無)」と「SEX=1(男)」の度数が出てませんね。
これは集計対象のデータセットDT1に該当の値が存在しないからです。
PROC FREQでは現状0件の水準を出せないので、PROC SUMMARYで出してみましょう。
※今回の例は「1変数毎の頻度集計」のみに対応しています
POINT1
※また、集計対象が0オブザベーションの場合、今回紹介するオプションは機能しません。
proc summary data=DT1 print completetypes; class YN SEX / preloadfmt missing; format YN _YN. SEX _SEX.; ways 1; run; |
POINT1
PROC MEANSでも似たようなことが出来るけど、PROC SUMMARYを使った理由。
それは、以下の記事を見ると理解しやすいと思います。
POINT2
ちょっと解説すると、2つのプロシジャの違いのひとつが「VARステートメント」を省略した場合。
- PROC MEANS: CLASSステートメント等、その他のステートメントに指定していない「すべての数値変数の要約統計量」が求められる
- PROC SUMMARY:「オブザベーション数」のみ求められる
今回は頻度集計を求めたいだけなので、PROC SUMMARYが最適というわけです。
(ちなみにPROC SUMMARYでは「PRINT」オプションを指定しないと出力結果が表示されません)
サンプルプログラムで指定している「COMPLETETYPES」「PRELOADFMT」「WAYS」については以下の記事を見て頂くと理解しやすいと思います。
ちなみにCLASSステートメントに「MISSING」をつけているのは以下データステップ100万回で解説されている落とし穴予防の為です(今回の例では問題ないけど)
- 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 複数変数を利用して
また別の方法として、こちらも以下SASYAMAさんが記事にされてるCLASSDATA=オプションを使うのも良い手だと思います。
・水準がデータで揃わずスカスカの集計表に立ち向かう_meansやsummaryのclassdata=とtransposeのid 複数変数を利用して
0 件のコメント:
コメントを投稿