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を読んだりしても使い方が
よくわかりませんでした。
こんにちは。
返信削除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
有難うございます!!
返信削除凄いわかりやすいサンプルプログラムです。なるほど~。
奥が深いですね。
SCLもっと勉強しています。
助かりました!
度々すみません、
返信削除私のコメントでちょっと訂正です、、
「MODIFYが効いてない」というより、「REMOVEが効いてない」でした。
SASは物理的削除と、論理的削除があって、
DELETEステートメントが物理的削除、REMOVEステートメントは論理的削除が可能で、そこの違いがNOBSとNLOBSで出てるようですね。
この辺の取扱いも面白いものではありますね。
超細かい話ですみません。