ATTRN関数でwhere条件にかかったオブザベーション数を取得する

オブザベーション数をマクロ変数に格納する方法から、SCL関数を僕が勉強していく話
http://sas-tumesas.blogspot.jp/2014/03/scl.html

でATTRN関数にNOBSを指定してオブザベーション数を取得する話を紹介しました。

関連する話題として、open関数にwhereデータセットオプションをくっつけた場合について
紹介します。


data A;
do X=1 to 10;
 output;
end;
run;


data A1;
   DSID=open(("A(where=((X > 3))"),'i');
   NOBS=attrn(dsid,"NOBS");
   NLOBSF=attrn(dsid,"NLOBSF");
run;







といった感じでNOBSオプションはあくまでデータセットのオブザベーション数を返し
NLOBSFとすると、実際に抽出されるオブザベーション数がとれます。
例の場合3レコードが抽出でかからなかったということがよくわかります。

で、最後に、ご存知の方がいらっしゃればご教示いただきたいのですが
NOBS NLOBSF 以外にNLOBSというのも指定できるのですが、Helpを読んだりしても使い方が
よくわかりませんでした。



3 件のコメント:

  1. こんにちは。
    SCL面白いですよね。
    詳しいわけではないんですが、
    違いが分かるようサンプルを作ってみました。
    分かりにくいプログラムですみません。

    NOBSはSQLやMODIFYが効いてないようです。

    data A1 A2 A3;
    do X=1 to 10;
    output;
    end;
    run;


    data A1;
    set A1;
    if X=10 then delete;
    run;

    data A2;
    modify A2;
    if X=10 then remove;
    run;

    proc sql;
    delete from A3
    where X=10;
    quit;



    %macro TEST;
    data OUT1;
    %do I = 1 %to 3;
    DSID = open(("A&I(where=((X > 3))"),'i');
    NOBS = attrn(dsid,"NOBS");
    NLOBSF = attrn(dsid,"NLOBSF");
    NLOBS = attrn(dsid,"NLOBS");
    NDEL = attrn(dsid,"NDEL");
    output;
    put (_all_) (=);
    %end;
    run;
    %mend;
    %TEST;

    == LOG =============
    DSID=1 NOBS=9 NLOBSF=6 NLOBS=9 NDEL=0
    DSID=2 NOBS=10 NLOBSF=6 NLOBS=9 NDEL=1
    DSID=3 NOBS=10 NLOBSF=6 NLOBS=9 NDEL=1

    返信削除
  2. 有難うございます!!
    凄いわかりやすいサンプルプログラムです。なるほど~。
    奥が深いですね。
    SCLもっと勉強しています。
    助かりました!

    返信削除
  3. 度々すみません、
    私のコメントでちょっと訂正です、、
    「MODIFYが効いてない」というより、「REMOVEが効いてない」でした。
    SASは物理的削除と、論理的削除があって、
    DELETEステートメントが物理的削除、REMOVEステートメントは論理的削除が可能で、そこの違いがNOBSとNLOBSで出てるようですね。
    この辺の取扱いも面白いものではありますね。
    超細かい話ですみません。

    返信削除