2016年8月1日月曜日

NOBS=オプションの性質 【オブザベーション数の取得】




「NOBS=」はSETステートメントで使えるオプションです。まず構文から見ていきましょう。




構文

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

  • SETしたデータセットのオブザベーション数を一時変数に格納
  • 一時変数なので、作成したデータセットには残らない
  • WHERE等の文があっても、抽出前のオブザベーション数しか取得できない
  • SASビューとか、TAPE, XMLのようなシーケンシャルエンジンとか、特殊なデータではオブザベーション数の取得に対応していない場合があるので注意
  • その他、落とし穴もあるので、下部の方に貼った注意点の記事リンクも要確認!




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

* オブザベーション数の取得 ;
data DT2;
   set DT1 nobs=_OBS;
   OBS = _OBS;
run;

  X   
 OBS  
   1    3
   2    3
   3    3





NOBS=オプションの性質


NOBS=オプションは、データステップ内の他のプログラムが実行される前に働きます。
以下のプログラムをご覧ください。


data _null_;
   put _OBS;
   stop;
   set DT1 nobs=_OBS;
run;

ログ
3


set DT1 nobs=_OBS;」で一時変数_OBSにオブザベーション数を格納しています。
その前の 「put _OBS;」で、_OBSの値をログにputしてから、「stop;」で、データステップをstopしています。


stopしてるので、その下の「set DT1 nobs=_OBS;」は実行されないんですが、NOBS=オプションだけは他のプログラムが実行される前に既に働いています。

つまり、「SETステートメントは実行しないけど、オブザベーション数だけ先に取ってくる」 という事をやってのけています。




NOBS=の注意点

行削除の落とし穴
http://sas-boubi.blogspot.jp/2014/05/blog-post_20.html




NOBS=の性質を利用したテクニック

【訂正追補】SASデータセットのオブザベーション数をマクロ変数に格納する方法_call symput
http://sas-tumesas.blogspot.jp/2013/10/sascall-symput.html(データステップ100万回)


データステップ内で、色々なデータセットのオブザベーション数を取得する
http://sas-boubi.blogspot.jp/2015/06/blog-post_26.html



0 件のコメント:

コメントを投稿