【訂正追補】SASデータセットのオブザベーション数をマクロ変数に格納する方法_call symput

前回の投稿で、データセットのobs数をマクロ変数に格納する際に

data _NULL_;
 set A end=eof;
  if eof then call symputx('obs1',_N_);
run;

を提示し、問題点として、データセットが空であった場合、マクロ変数が作成されず
0がとれないと挙げたのですが、

data _NULL_;
 call symputx('obs',tobs);
 if 0 then set A nobs=tobs;
 stop;

run;

このようにすればいいのではないかとご指摘をいただきました。
その通りでした。素晴らしいです。

この場合、1行も読み込むことなくマクロ変数を作成しているので
元データセットが巨大で、obs数をとりたいだけの場合などに
余計な読み込みで処理時間を無駄にすることもなく最強です。
data _NULL_で_N_使うのは確かに無駄でした。反省します。

nobs=で任意の変数にデータセットのobs数を格納することができるのですが
どうもこれ、データステップの開始の時点で格納されるらしく、setステートメントの前、
というかコードの先頭ですでに取得可能なんですね、面妖な、、。

if 0 はif _N_=0 などでもよく、ようは絶対に実行されないif文ですね。
絶対に実行されないif文は、実行はさせないけど、データの定義情報(ディスクリプタ部)を
つかいたい時の方法ですね。知らないと、何してんだこいつ的コードですが。

Sさん有難うございます。
でも会社で、おっきな声でブログが、って言わないでください、、、。



0 件のコメント:

コメントを投稿