2006年7月1日土曜日

オブザベーション数をマクロ変数として取得する方法



SASでプログラミングをする際、
任意のSASデータセットのオブザベーション数を取得したい場合がよくあります。

いろいろと手法はあると思いますが、
ここでは以下3つの方法を紹介します。

オブザベーション数を取得するSASデータセットは、
下記『temp.sas7bdat』とします。

 f:id:n-insight:20070302235244g:image


 ①SETステートメントの「NOBS=」オプションを使用する場合

 data _NULL_ ;

  set temp nobs=obs ;

  call symput("TOTAL_OBS1", obs) ;

  stop ;

 run ;

これが一番普通の手法でしょうか。

NOBS=の後に記述したSAS名(ここではobs)に、
SETしたSASデータセットのオブザベーション数が入ります。

あとは、CALL SYMPUTルーチンでマクロ変数を定義するだけです。

実行結果は下記の通りです。

 f:id:n-insight:20070302235330g:image



 ②SQLプロシジャを使用する場合

 proc sql noprint ;

  select count(*) into: TOTAL_OBS2

  from temp ;

 quit ;

まず、count()はSQLの関数です。


「count(変数名)」のように変数を引数に与えることもできますが、
引数で指定した変数に欠損値またはブランクがある場合、
そのオブザベーション(行)をカウントしてくれません。
(もちろん、それを理解したうえで使う場合もありますが…)

そのため、このような場合ではcount(*)と記述します。

次に、count(*)の戻り値をマクロ変数として定義するために、
「into: マクロ変数名」というかたちで記述します。


実行結果は下記の通りです。

 f:id:n-insight:20070302235352g:image


 ③マクロ関数%SYSFUNCでSCL関数を使用する方法

 %let DSID = %sysfunc(open(temp)) ;

 %let TOTAL_OBS3 = %sysfunc(attrn(&DSID, nobs)) ;

 %let rc = %sysfunc(close(&DSID)) ;



最後は、かなりマニアック(?)な方法です。

SCLとはScreen Control Languageの略で、
SAS/AFプロダクトなどで使われるSAS言語のうちのひとつです。

ここではそのSCL関数の中から下記3つを使用します。

  • OPEN関数 ・・・SASデータセットを開く

  • ATTRN関数・・・SASデータセットの情報を取得する

  • CLOSE関数・・・SASデータセットを閉じる

まずは、OPEN関数でSASデータセットを開きます。

「OPEN(SASデータセット名)」
また、以降の処理で開いたSASデータセットを識別するために、
戻り値をマクロ変数として定義しています。

次に、ATTRN関数でSASデータセットの情報(ここではオブザベーション数)を取得します。
「ATTRN(SASデータセット識別子, 第2引数)」
OPEN関数で開いたSASデータセットの識別子を第1引数に与えます。
また、第2引数にNOBSというキーワードを指定を指定します。
(NOBS以外にも指定できるキーワードはあります。詳しくはまたの機会に。)

最後に、CLOSE関数で開いているSASデータセットを閉じます。
「CLOSE(SASデータセット識別子)」

OPEN関数で開かれたSASデータセットは、そのままだと開かれたままの状態です。
余程の理由がない限り、CLOSE関数で必ず閉じましょう。

実行結果は下記の通りです。

 f:id:n-insight:20070302235416g:image



以上。長くなりましたが、3通りの方法を紹介しました。
どれがベストな方法かは答えられません。

  • 単純にオブザベーション数を取得するだけなのか

  • 一緒に他の処理も行う必要があるのか

  • 想定されるデータ(容量)はどれぐらいなのか
等、シチュエーションは様々でしょう。
これに限ったことではありませんが、
いくつかの手法の中から状況に応じて使い分けることが、理想でありベストな方法なのだと思います。

0 件のコメント:

コメントを投稿

ネイチャーインサイト サイトリニューアル&NIBLOGの引っ越し

ご連絡が遅くなりましたが、 ネイチャーインサイトの際とがリニューアルしました。 https://www.n-insight.co.jp/ それに伴い、NIBLOGも引っ越しすることになりました。 https://www.n-insight.co.jp/niblog/ ...