2014年8月7日木曜日

SETステートメントの落とし穴2「変数の初期化」


SETステートメントの落とし穴「値の保持」の続きです。


サンプルデータ

data DT1;
   A="003";  B=1;  C=.;  output;
run;

data DT2;
   A="001";  B=1;  output;
   A="001";  B=.;  output;
   A="002";  B=.;  output;
   A="003";  B=.;  output;
;
run;

proc sort data=DT1; by A; run;
proc sort data=DT2; by A; run;

 DT1DT2
 C  
 003 
  1  
  .  
 A  
 B  
 001 
  1  
 001
  . 
 002
  .
 003
  .


問題
サンプルデータより以下のプログラムを実行すると、①②どちらのデータが出来るでしょうか?

data DT3;
   set DT1 DT2;
   by A;
   if  B=1 then C=111;
run;

 ①

  A  
C
  1  
  001 
  1   
 111 
  2 
  001
  . 
 111
  3 
  002
  . 
  . 
  4 
  003
  1
 111
  5
  003
  .
  .

  A  
C
  1  
  001 
  1   
 111 
  2 
  001
  . 
 111
  3 
  002
  . 
 111
  4 
  003
  1
 111
  5
  003
  .
 111

正解は①です!


ポイントは「BY値が変わると、PDV内の変数値が初期化される」という事です。

①の3行目はBY変数Aが「001」から「002」に変わってます。そのためPDV内の変数値が初期化され変数CがNULLになったというわけです。

4行目と5行目のBY値はともに「003」ですが、4行目で読み込んでるデータセットはDT1で、5行目はDT2から読み込んでいます。
これは前回説明しましたが、読み込むデータセットが変わった場合もPDV内の変数値が初期化されるので、5行目のCはNULLになります。


一言でまとめると。。「別のデータセットか別のBY値になったら初期化される」という事です。


2回に分けて落とし穴というタイトルでまとめましたが、
実はこの性質を理解すれば、色々面白いことが出来ちゃうので、また別の機会に紹介したいと思います。

0 件のコメント:

コメントを投稿