2015年10月1日木曜日

暗黙のOUTPUTステートメント



今回の内容は、PDV(プログラムデータベクトル)を理解していないと、正確な動きを理解しづらいかも。

あと、データステップ中にMODIFYステートメントを使用していない前提での説明となります無限ループになったり挙動が変わることがあるので・・)



サンプルデータ

data DT1;
   length A 8.;
   A=1; output;
   A=2; output;
run;

  A  
  1
  2



暗黙のOUTPUT


以下は単純なデータステップですが、、

data OUT1;
   set DT1;
run;

内部では、SETに指定した「DT1」から1オブザベーション毎にPDV(読み込んだデータを入れておく一時的な箱)で処理してから、出力データセット「OUT1」に出力していて、
この処理の流れが「DT1」から1オブザベーションずつ、全オブザベーションに対して反復されます。


そして実は、データステップの各反復の最後にOUTPUTステートメントが自動で実行されています。
(以下はあくまでもイメージ)

data OUT1;
   set DT1;
   output;
run;


OUTPUTステートメントとは、
読み込んだオブザベーションに対する処理結果を、データセットに出力するステートメントです。

つまりOUTPUTが自動で実行されるおかげで、データセットへの出力ができているわけです。
(これを「暗黙のOUTPUT」と呼びます)



例外


以下のようにプログラマ側が明示的にOUTPUTステートメントを記述した場合、、

data OUT2;
   set DT1;
   if A=2 then output;
run;

  A  
  2

明示的に記述したOUTPUTが優先され、暗黙のOUTPUTは実行されなくなります。



注意


以下の実行結果は想定通りでしょうか?

data OUT3;
   length A B C 8.;
   A=1;
   B=1;
   output;
   C=1;
run;

 A  
 B  
 C  
  1  1  .

① まず「output;」によって、明示的にOUTPUTを行うタイミングを変えています。
② 次に「C=1;」とありますが、①で既にデータセットへの出力が済んでるため、この処理結果はデータセットに反映されません。よってCは欠損値になります(変数自体は作られます。データステップで作成した変数は記述位置に関係なく変数の枠が最初に作られるので)


ちなみに、明示的なOUTPUTを複数記述することもできます。

data OUT4;
   length A B C 8.;
   A=1;
   B=1;
   output;
   C=1;
   output;
run;

 A  
 B  
 C  
  1  1  .
  1  1  1

OUTPUTする度に、データセットにオブベーションが追加され、
2個目のOUTPUTで「C=1;」が反映されたオブザベーションが追加されています。


0 件のコメント:

コメントを投稿