(注意!)
今回の方法で正しく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; DT2_OBS = _OBS2; run;
|
解説
プログラム青字部分がポイントです。
「if 0 then」 の 「0」 は 「false」 の意味になり、then以降の 「set DT1(drop=_ALL_) ・・・」 の部分は実行されません。
。。のはずですが、たとえ実行されなくてもデータセット名の指定があると、コンパイル時にそのデータセットの定義情報だけが読み込まれます。
この性質を利用し、
・まず 「if 0 then set DT1」 でDT1の定義情報だけを読み込みます。
・変数定義も読み込まれてしまうので 「DT1(drop=_ALL_)」 で読み込まれる全変数をdropする。
・「nobs = 適当な一時変数名」で、定義情報に格納されたobs数を一時変数に格納。
といった流れです。
※ 以下記事の通り、特殊な処理をしてる場合は、正しくobs数を取得できないのでご注意ください。
行削除の落とし穴
0 件のコメント:
コメントを投稿