2014年1月16日木曜日

オブザベーション数を取得する自動マクロ変数「&SYSNOBS」




SAS9.3から、かなり使える自動マクロ変数「SYSNOBS」が追加されました。

このマクロ変数にはDATAステップやPROCステップで最後に閉じられたデータセットから読み取られたOBS数が格納されます。

以下に具体的な動作をまとめてみました。



マクロ変数「NOBS」にOBS数を格納する例。

*** 具体例① **************;
data DT1;
  V1=1; output;
  V1=2; output;
run;

%let NOBS=&SYSNOBS;

解説
データセット「DT1」が作成され、OBSは2行。
よって、「SYSNOBS」は「2」となる。



*** 具体例② **************;
proc sort data=DT1 out=DT2;
  by V1;
  where V1=1;
run;

%let NOBS=&SYSNOBS;

解説
データセット「DT1」をもとに「where V1=1」の1OBSが抽出されてソートされ、「DT2」が作成される。
よって、「SYSNOBS」は1」となる。



*** 具体例③ **************;
data _NULL_;
  set DT1;
  where V1=1;
run;

%let NOBS=&SYSNOBS;

解説
注意が必要。
データセット「DT1」をもとに「where V1=1」の1OBSが抽出される。
しかし、「data _NULL_」としているので、データセットは作成されない。
よって、ここで最後に閉じられたデータセットは「DT1」なので、「SYSNOBS」は「DT1」のOBS数である「2」となる。



*** 具体例④ **************;
proc sql noprint;
  select *
  from DT1
  where V1=1;
quit;

%let NOBS=&SYSNOBS;

解説
注意が必要。
こちらも上記同様、SQL文の中で「create table」を記述していないので、最後に閉じられたデータセットは「DT1」となり、「2」となる。



*** 具体例⑤ **************;
data V1 / view=V1;
  set DT1;
run;

data _NULL_;
  set V1;
run;

%let NOBS=&SYSNOBS;

解説
注意が必要。
viewは特殊なデータなので、OBS数は取得できず、「-1」が返される。




まとめ

あと仕様なのか、環境やバージョンによって挙動は異なるかもですが、データセットをダブルクリックで開いてすぐ閉じてから、
「%put "&SYSNOBS";」
と書いて実行しログに出力された値を見ると「1090」という謎値が返される。

独特な動きをするけど、そこを理解することでかなり使える。

0 件のコメント:

コメントを投稿