ラベル ODS SELECT の投稿を表示しています。 すべての投稿を表示
ラベル ODS SELECT の投稿を表示しています。 すべての投稿を表示

2017年6月30日金曜日

プロシジャ実行時に、「結果ビューア」等への出力をしないで、「データセット」に出力する。



以下をご覧ください。

ods output Moments=OUT1;

   proc univariate data=SASHELP.CLASS;
       var AGE;
   run;

ods output close;


ODS OUTPUT を使って、プロシジャの結果をデータセットに出力しています。
「ODS OUTPUT」については以下記事で紹介済です。


ここから本題で、
「データセットに出力したいだけで、結果ビューアにプロシジャの結果が出るの邪魔くさい!」っていう時ありますよね。



そんな時は「ODS SELECTステートメント」
ODS出力先(HTML, LISTING, RTF等)に対して、プロシジャ等の結果を送らないように出来ます。

(少し独特な挙動なので、以降の解説も見ていただいて理解して使った方がよいです)

ods select none;
ods output Moments=OUT1;

   proc univariate data=SASHELP.CLASS;
      var AGE;
   run;

ods output close;
ods select all;


解説

ODS SELECT NONE:
ODS出力先に対して、出力オブジェクト(プロシジャ等の結果)を送らないようにします。

ODS SELECT ALL:
ODS出力先に対して、出力オブジェクト(プロシジャ等の結果)を送る設定をSASのデフォルトの状態に戻します。


「ODS SELECT NONE」を実行すると、
通常「ODS SELECTステートメント」または「ODS EXCLUDEステートメント(説明省略)」で設定を変更しない限り、ODS出力先にプロシジャ等の結果を送ることは出来ません。

ただし「ODS OUTPUT」だけは例外で、上の例のように「ODS SELECT NONE」の直後でもプロシジャの結果等をデータセットに出力することが出来ます。



ちなみに、ちょっと前に以下の記事で「ODS RESULTS」を紹介しました。
「ODS RESULTS」で結果ウインドウへの表示を抑制する

「ODS SELECT」と「ODS RESULTS」は似たような事が出来るので混同しがちですが、機能としては全然別物なのでご注意を。




2016年8月26日金曜日

集計結果から必要なものだけ表示する 【ODS SELECT編】



例えば、univariateプロシジャを実行すると色々な統計量が出力されます。
この出力から必要なものだけに絞って出力する方法の紹介です。


①まずは「ODS TRACE」で出力オブジェクトの名前を調べる
ods trace on;
proc univariate data=sashelp.class;
 var age;
run;
ods trace off;


ログ


集計プロシジャを「ods trace on;」 と 「ods trace off;」で囲って実行すると、ログに上のような表示が現れます。
ログに出てきた「名前」のところにあるキーワードを覚えておきましょう。
たとえば今回出力したいのが「モーメント」と「基本統計量」であれば、「Moments」と「BasicsMeasures」という名前を覚えておきます。




②「ODS SELECT」で集計結果を絞る(注意点あり)
ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var age;
run;
ods select all;

結果ビューア



今度は集計プロシジャを「ods select  名前;」 と 「ods select all;」で囲い直します。
名前のところに先ほどのキーワード「Moments」「BasicsMeasures」を当てはめます。

実行すると上の通り、見事欲しい結果だけ出力することが出来ました。


📝 注意点①

2つのunivariateプロシジャに対して「Moments」と「BasicMeasures」のみ出力したい場合、以下の書き方はNG

* NG: ダメな書き方 ;
ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var age;
run;

proc univariate data=sashelp.class;
 var height;
run;
ods select all;

実行してみると分かりますが、
ods selectで設定した「Moments」「BasicMeasures」は、1個目のunivariateプロシジャにしか適用されていません。


以下のようにプロシジャ毎にods selectを書く必要があります。

* OK ;
ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var age;
run;
ods select all;

ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var height;
run;
ods select all;


📝 注意点②

以下のプログラムを実行するとWARNINGが出て、うまくいきません。
何故でしょうか?

* NG: ダメな書き方 ;
proc reg data=sashelp.class;
 model height = age;
run;

ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var age;
run;
ods select all;

ログ
 WARNING: 出力'Moments'は作成されていません。出力オブジェクト名、ラベル、
          パスが正しく記述されているかを確認してください。また、
          要求した出力オブジェクトを作成するために、適切なプロシジャオプションが使われ
          ているかも確認してください。たとえば、
          NOPRINTオプションが使われていないことを確認してください。
 WARNING: プロシジャステートメントの終わりを検出したので、
          現在のODS SELECT/EXCLUDE/OUTPUTステートメントをクリアしました。
          対話型プロシジャ(終了するにはquit;をタイプします)が終了していないかもしれません。


これは対話型プロシジャを使う場合に起こる落とし穴です。
(対話型プロシジャについては、「RUNとQUITの違い」をご覧ください。)


今回の例で使用しているregプロシジャは対話型プロシジャです。
「quit;」と書くか、別のdataステップ・procステップが現れるまで、regプロシジャは起動したままになります。
なので、起動したままのregプロシジャに対して、ods selectが適用されてしまい、おかしな結果になってしまったわけです。

この場合「quit;」を入れるだけで解決です。

* OK ;
proc reg data=sashelp.class;
 model height = age;
run;
quit;

ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var age;
run;
ods select all;



📝 注意点③

ごくごく一部のプロシジャ(gplotプロシジャ等)は、実行する度にods traceで得られる出力オブジェクトの名前が変わるので注意!