2015年6月26日金曜日

データステップ内で、色々なデータセットのオブザベーション数を取得する


(注意!)
今回の方法で正しくobs数を取得できないケースもあるので、記事の最後に貼っているリンク記事も参照下さい。



まずは適当なサンプルデータを用意。

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

data DT2;
   do i=1 to 20;
      output;
   end;
run;

data DT3;
   A="aa";  output;
   A="bb";  output;
   A="cc";  output;
run;

DT1 は10obs、DT2 は20obsを持つデータセットです。



ここで、DT3を読み込むときに、DT1とDT2のobs数も取得したいとします。

* 各データセットのOBS数を取得 ;
data OUT1;

   set DT3;

   if 0 then set DT1(drop=_ALL_)  nobs= _OBS1;
   if 0 then set DT2(drop=_ALL_)  nobs= _OBS2;

   DT1_OBS = _OBS1;
   DT2_OBS = _OBS2;

run;

  A  
 DT1_OBS 
 DT2_OBS 
  aa 
  10  
  20 
  bb
  10  
  20 
  cc
  10  
  20 


解説

プログラム青字部分がポイントです。
if 0 then」 の 「0」 は 「false」 の意味になり、then以降の 「set DT1(drop=_ALL_) ・・・」 の部分は実行されません。
。。のはずですが、たとえ実行されなくてもデータセット名の指定があると、コンパイル時にそのデータセットの定義情報だけが読み込まれます。

この性質を利用し、
・まず 「if 0 then set DT1」 でDT1の定義情報だけを読み込みます。
・変数定義も読み込まれてしまうので 「DT1(drop=_ALL_)」 で読み込まれる全変数をdropする。
・「nobs = 適当な一時変数名」で、定義情報に格納されたobs数を一時変数に格納。
といった流れです。


※ 以下記事の通り、特殊な処理をしてる場合は、正しくobs数を取得できないのでご注意ください。
行削除の落とし穴


0 件のコメント:

コメントを投稿