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 件のコメント:
コメントを投稿