2015年6月13日土曜日

特定条件の時だけ、RETAIN機能を無効にする。




以下のデータを見てください。

*** サンプルデータ ;
data DT1;
input A B @@;
cards;
1 100 2 . 3 200 4 . 5 400 6 .
;

 A 
   1 
 100  
   2  
  . 
   3  
 200 
   4  
  .
   5  
 400
   6 
  .



このデータで、まずはBの値を単純にRETAINした変数B2を作ってみます。

*** Bの値をRETAIN ;
data OUT1;
   set DT1;

   retain B2;
   if B ^=. then B2 = B;
run;

 A 
B2
   1 
 100  
 100  
   2  
  . 
 100  
   3  
 200 
 200  
   4  
  .
 200  
   5  
 400
 400  
   6 
  .
 400  



次が問題。
たまに特定条件の時だけ、RETAIN機能を無効にしたい事があります。

たとえば、以下のように A=3 の時だけ、RETAINしたくないとします。
(3オブザベーション目の 「200」 が次のオブザベーション以降に保持されないようにする)

 A 
B2 
   1 
 100  
 100  
   2  
  . 
 100  
   3  
 200 
 200  
   4  
  .
   .  
   5  
 400
 400  
   6 
  .
 400  



*** A=3の時だけ、RETAIN機能を無効にする ;
data OUT2;
   set DT1;

   retain B2;
   if B ^=. then B2 = B;
   output;

   if A=3 then B2=. ;
run;



上の赤文字が追加した文。

データセットDT1の3オブザベーション目に対する処理の動きを説明すると、

①「output;」で3オブザベーション目の現状の処理結果をデータセットに出力してから、
②「if A=3 then B2=.;」で A=3 の場合にB2を初期化(欠損値に)しています。


上記①で3オブザベーション目に対する処理結果をデータセットに出力済みなので、②の処理は3オブザベーション目の処理としてはデータセットに反映されず、PDV (処理が行われる一時的な箱) のみに保持されています。

このPDV内のB2は、「retain B2;」により次のオブザベーションを読み込む際にもその値が引き継がれます。


③ 上記②でPDVのB2が初期化された場合、次のオブザベーションには欠損値になったB2が引き継がれる(=RETAIN機能が無効になる)、というわけです。



0 件のコメント:

コメントを投稿