オブザベーション数をマクロ変数に格納する方法から、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関数を使うわけですね。

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





0 件のコメント:

コメントを投稿