2016年11月30日水曜日

PROC ODSTABLEによるレポート出力



HTMLやRTFなどにレポート出力したい場合、REPORTプロシジャを使う事が多いと思います。
また以下のようにTEMPLATEプロシジャとデータステップで出力する方法もあります。

(以降、出力先がHTMLの場合の結果を示します)

proc template ;
  define table test;
    column NAME SEX AGE HEIGHT HEIGHT_CM;

    define HEIGHT;
       style={color=red};
    end;

    define HEIGHT_CM;
       compute as round((HEIGHT*2.54),0.1);
       header="Height (cm)";
       format=8.1;
       style={color=blue};
    end;
  end;
run;

data _null_;
   set SASHELP.CLASS;
   file print ods=(template="TEST");
   put _ods_;
run;




そして、SAS9.3からODSTABLEプロシジャが追加されました。構文はTEMPLATEプロシジャと同じです。

たとえば、上で書いたTEMPLATEプロシジャの青字部分をコピーして、以下のように「proc odstable」と「run」で囲むだけで完成です。

proc odstable data=SASHELP.CLASS ;
    column NAME SEX AGE HEIGHT HEIGHT_CM;

    define HEIGHT;
       style={color=red};
    end;

    define HEIGHT_CM;
       compute as round((HEIGHT*2.54),0.1);
       header="Height (cm)";
       format=8.1;
       style={color=blue};
    end;
run;


TEMPLATEプロシジャのように出力用のデータステップを書かなくていいのが便利ですね。
構文もなんとなくREPORTプロシジャに似てます。


あと便利だなーと思ったのが、以下のような場合。

proc odstable data=SASHELP.CLASS;
    column NAME SEX (HEIGHT WEIGHT) ;
    define HEIGHT;
       header="Height, Weight";
    end;
run;

変数HEIGHTとWEIGHTを縦に並べて出力しています。
REPORTプロシジャだとこれが出来ないんですよね。


注意点

TEMPLATEプロシジャと構文が一緒だけど一部ODSTABLEでは使えない機能があるようです。
また、HTML, RTF, LISTING等の出力先によって挙動が異なったり、動作しない機能などもあると思うので、別途リファレンスを確認したり、挙動確認をして下さい。



ちなみに以下、入門記事も書いています。


2016年11月22日火曜日

【小ネタ】 CARDSは 「RUN;」 が不要



データステップってふつう 「RUN;」 で締めるのがふつうですよね。

data DT1;
  A=1;
run;

RUN; で「終わりか」と判断してデータステップを終わらせてくれます。



しかし以下のようにCARDSステートメントがあると、、

data DT1;
input A;
cards;
1
2
3
;

ログ
NOTE: データセットWORK.DT1は3オブザベーション、1変数です。


RUN; がなくても実行出来ちゃいました。
CARDS4、DATALINES、DATALINES4の各ステートメントでも同様でした。


よく分からないけど、そうなのか。
分かっててもなんとなく違和感あるから RUN; つけちゃうけど。

2016年11月17日木曜日

PROC REPORTでヘッダーを改行するもう一つの方法



以下記事で、ヘッダーを改行する方法を紹介しました。
REPORTプロシジャ入門2:ヘッダーの設定



別の方法として、以下のように書いてもヘッダーを改行できます。
青字部分は通常の改行の書き方で、赤字部分が今回紹介したかった書き方)

proc report data=sashelp.class split="#";
   column name age;
   define name /  display  "ABC#DEF#GHI";
   define age    /  display  "ABC" "DEF" "GHI";
run;



PROC REPORTで、表示する変数の数が多い場合に分割(ページを分ける)方法



PROC REPORTの「PAGEオプション」と「IDオプション」を紹介します。


早速ですが、
以下は特定の変数のところでページを分割する例です。

ods rtf file="出力ファイルのフルパス";

   proc report data=sashelp.class;
       column name sex age height weight;
       define name / display;
       define sex / display;
       define age / display;
       define height / display page;
       define weight / display;
   run;

ods rtf close;




PAGEオプションを指定した変数のところで、ページ分割されます(上の例では変数HEIGHTのところで分割)

注意点として、
他のオプションとの組み合わせによってはPAGEオプションが動作しない場合があります。
また、LISTING出力先とそれ以外の出力先とで挙動に差異があるようです。
詳細はSAS社リファレンスのPAGEオプションのところをご確認下さい。
SAS Help Center: Syntax: PROC REPORT DEFINE Statement



続いて、PAGEオプションと併用すると便利なIDオプションの例。
以下は変数NAME, SEXを「ID変数」として、各ページの左側に固定で表示させています。

ods rtf file="出力ファイルのフルパス";

   proc report data=sashelp.class;
       column name sex age height weight;
       define name / display;
       define sex / display id;
       define age / display;
       define height / display page;
       define weight / display;
   run;

ods rtf close;



COLUMNステートメントに指定された変数の順に「1列目の変数」~「IDオプションを指定した変数」までを、各ページの左側に固定で表示させています。