2015年7月31日金曜日

RWIで集計表を作る


今回のゴールはRWIで以下の表をPDF形式で作成することです。
集計に使うデータセットは「SASHELP.CARS」の先頭80obsとします。

(注意:今回のプログラムには、HTML形式でサポートされていないオプションを使用しています)




ステップ①

  • まずFREQプロシジャで集計し、結果をデータセットに出力します。
  • 結果のデータセットを加工して、RWIで出力しやすい形にします。

*=== 集計 ===========================================;
proc freq data=SASHELP.CARS (obs=80) noprint;
     tables MAKE / out=OUT1;
     tables TYPE / out=OUT2;
run;

*=== 集計結果を出力の形に加工 =======================;
data OUT;
     length NO 8. ITEM1 ITEM2 COL1 COL2 $20.;

     set OUT1 (in=_IN1)
           OUT2 (in=_IN2)
     ;
     *** 項目No.、項目名の導出 ******************;
     NO    = whichn(1,of _IN:);
     ITEM1 = choosec(NO, "Make","Type");
     ITEM2 = coalescec(MAKE,TYPE);

     *** Nとパーセントを出力の形に **************;
     COL1 = cats(COUNT);
     COL2 = cats( "(", put(round(PERCENT,.1), 8.1) ,")" );
run;






ステップ②

  • 上で作ったデータセットをRWIで出力します。

*=== 出力開始 ===========================================;
options nodate;
ods pdf file="出力するファイルのパス\RWI_Sample2.pdf" style = printer;

data _NULL_;
     length LINE $5.;

     set OUT end=EOF;
     by NO ;

     if _N_=1 then do;
         dcl odsout ob();
         ob.title(data:'集計結果');
         ob.table_start();

         *** 項目名を出力 *************************;
         LINE = "LR";
         ob.head_start();
         ob.row_start();
             ob.format_cell(data:"因子", inhibit:LINE, style_attr:"background=white cellwidth=3cm just=l");
             ob.format_cell(data:""       , inhibit:LINE, style_attr:"background=white cellwidth=3cm just=l");
             ob.format_cell(data:"n"     , inhibit:LINE, style_attr:"background=white cellwidth=2cm just=r");
             ob.format_cell(data:"(%)"  , inhibit:LINE, style_attr:"background=white cellwidth=2cm just=l");
         ob.row_end();
         ob.head_end();
     
end;

     *** データの中身を出力 ***********************;
     * 各集計項目の先頭を1行あける。 ;
     if first.NO then do;
         ob.row_start();
         ob.format_cell( data:ITEM1 , inhibit:"BLR", column_span:4, style_attr:"just=l");
         ob.row_end();
     end;

     * データの中身を出力 ;
     * 変数LINEに、行毎の罫線の設定を格納 ;
     LINE = "TBLR";
     if EOF then LINE="TLR";

     ob.row_start();
         ob.format_cell( data:""        , inhibit:LINE, style_attr:"just=l");
         ob.format_cell( data:ITEM2 , inhibit:LINE, style_attr:"just=l");
         ob.format_cell( data:COL1  , inhibit:LINE, style_attr:"just=r");
         ob.format_cell( data:COL2  , inhibit:LINE, style_attr:"just=l");
     ob.row_end();

     * 最後に表作成を終了 ;
     if EOF then ob.table_end();
run;

ods pdf close;


出力結果

  • プログラム中の青字のパスを各時環境のパスに変更してください。
  • SAS9.4より前のバージョンでは「style_attr」の部分をすべて「overrides」に変えて下さい。
  • その他、バージョン毎に構文が変わっている箇所があるので、実行失敗してないかログを要確認。


今回のポイントは format_cellメソッド内の「inhibitオプション」による罫線の細かい指定です。

構文
FORMAT_CELL( INHIBIT:'罫線を非表示にする位置 ' )

罫線を非表示にする位置
T ・・・ 上側
B ・・・ 下側
L ・・・ 左側
R ・・・ 右側

例 : 上下の罫線を非表示にする
FORMAT_CELL( INHIBIT : 'TB' ) ;

注意:現状、inhibitオプションはHTML形式ではサポートされていない


RWIについては、以下の入門シリーズにまとめています。
レポート作成インターフェイス(RWI)入門1


📝注意

記事の中で使用している「_N_」「END=オプション」「FIRST.BY変数」は「サブセット化IF」と一緒に使用すると正しく動かなくなりやすいです。


0 件のコメント:

コメントを投稿