ラベル attrn の投稿を表示しています。 すべての投稿を表示
ラベル attrn の投稿を表示しています。 すべての投稿を表示

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を読んだりしても使い方が
よくわかりませんでした。



オブザベーション数をマクロ変数に格納する方法から、SCL関数を僕が勉強していく話

以前、
SASデータセットのオブザベーション数をマクロ変数に格納する方法_call symput とsql select into: ①単純な1マクロ変数の作成


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


でオブザベーション数をマクロ変数にいれる話をしました。

最近、リンクさせていただいたブログ「SAS Utility」の中で、全く別のアプローチでオブザベーション数を取得していて、感動しました。


記事タイトル「マクロ %nobs


SCL関数をマクロに組み込んでいるわけですね。

そういえば、同じくリンクブログの「僕の頁 <SASと臨床試験と雑談と>徒然なるままにSAS暮らし」で
fetchobs関数」の紹介をされていました

これもそっち系の技術ですね。
なんか、感覚的にfetchobs関数の処理ってハッシュオブジェクトの処理と似てません?面白いです。

実は僕はSCLの類はさっぱりで、定型文を呪文的に使うことがあるぐらいだったので、今から勉強していきたいと思います。

例えば

data Q1(label='データセットラベル');
 X=1;Y=2;Z=3;output;
 X=1;Y=2;Z=3;output;
 X=1;Y=2;Z=3;output;
 X=1;Y=2;Z=3;output;
run;









data Q2;
 A=1;B=2;output;
 A=1;B=2;output;
run;







ここで、この2つのデータセットの変数の数、オブザベーション数、データセットについているラベル
帰属するライブラリ名を取得することを考えます。




 data A1;
   DSID=open('Q1');
   VARN=attrn(dsid,"NVARS");
   OBS=attrn(dsid,"NOBS");
   DSLABEL=attrc(dsid,'LABEL');
   LIB=attrc(dsid,'LIB');
  output;
   DSID=open('Q2');
   VARN=attrn(dsid,"NVARS");
   OBS=attrn(dsid,"NOBS");
   DSLABEL=attrc(dsid,'LABEL');
   LIB=attrc(dsid,'LIB');
  output;
run;





open関数を使ってデータセット名を指定するとそのデータセットがオープン状態になって操作するための固有IDみたいなんがとれるってことですよね?そしたらそれを第一引数として、戻り値が数字になるような属性をとる場合はATTRN関数、文字の場合はATTRC関数で、第二引数に欲しいパラメータを指定するわけですね。

なるほど、なるほど、通常のデータステップで使用する場合は、ステップ終了時にオープン状態が自動解除されるので、特に気にしなくていいけど、マクロ内で%sysfuncで実行する場合は、オープンのままになってしまうから、close関数を使うわけですね。

ちょっとずつわかってきました。