2016年5月25日水曜日

最後のオブザベーションかどうかを判定する方法【END=オプション】





今日たまたまタイトルにあるような質問を3回別の方から頂いたので記念に。



やりたい事


以下のデータで、最後のオブザベーションを読み込んだ時に何かしたい。

サンプルデータ ;
data DT1;
  do X=1 to 5;
      output;
  end;
run;

 X  
   1  
   2 
   3  
   4  
   5  




方法


SETステートメントに END=オプションを指定する事で、
  •  最後のオブザベーションだったら「1」、それ以外は「0」が一時変数に入る。
  •  一時変数は出力データセットに残りません。


構文

  SET データセット名  END = 適当な一時変数名;








以下は最後のオブザベーションだったら変数FLGに「1」を入れる例。

data DT2;
   set DT1 end=EOF;
   if EOF=1 then FLG=1;
run;

 X  
 FLG 
   1  
  .  
   2 
  .  
   3  
  .  
   4  
  .  
   5  
  1





注意


以下のようにWHEREステートメントで絞ったうえで最後のオブザベーションを判定することは出来ますが、、

data DT3;
   set DT1 end=EOF;
   where X < 3;
   if EOF=1 then FLG=1;
run;

 X  
 FLG 
   1  
  .  
   2 
  1  


サブセット化IFを使ってる場合は、判定できないのでご注意ください。

data DT3;
   set DT1 end=EOF;
   if X < 3;
   if EOF=1 then FLG=1;
run;

 X  
 FLG 
   1  
  .  
   2 
  .  


後、POINT=オプションによるランダムアクセスを使用してデータセットを読み取っている場合、END=オプションは使用できない(正しく動作しない)ようなので注意。


0 件のコメント:

コメントを投稿