SASでプログラミングをする際、
任意のSASデータセットのオブザベーション数を取得したい場合がよくあります。
いろいろと手法はあると思いますが、
ここでは以下3つの方法を紹介します。
オブザベーション数を取得するSASデータセットは、
下記『temp.sas7bdat』とします。
①SETステートメントの「NOBS=」オプションを使用する場合これが一番普通の手法でしょうか。
data _NULL_ ;
set temp nobs=obs ;
call symput("TOTAL_OBS1", obs) ;
stop ;
run ;
NOBS=の後に記述したSAS名(ここではobs)に、
SETしたSASデータセットのオブザベーション数が入ります。
あとは、CALL SYMPUTルーチンでマクロ変数を定義するだけです。
実行結果は下記の通りです。
まず、count()はSQLの関数です。
②SQLプロシジャを使用する場合
proc sql noprint ;
select count(*) into: TOTAL_OBS2
from temp ;
quit ;
「count(変数名)」のように変数を引数に与えることもできますが、
引数で指定した変数に欠損値またはブランクがある場合、
そのオブザベーション(行)をカウントしてくれません。
(もちろん、それを理解したうえで使う場合もありますが…)
そのため、このような場合ではcount(*)と記述します。
次に、count(*)の戻り値をマクロ変数として定義するために、
「into: マクロ変数名」というかたちで記述します。
実行結果は下記の通りです。
③マクロ関数%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データセットを開きます。
- OPEN関数 ・・・SASデータセットを開く
- ATTRN関数・・・SASデータセットの情報を取得する
- CLOSE関数・・・SASデータセットを閉じる
「OPEN(SASデータセット名)」
また、以降の処理で開いたSASデータセットを識別するために、
戻り値をマクロ変数として定義しています。
次に、ATTRN関数でSASデータセットの情報(ここではオブザベーション数)を取得します。
「ATTRN(SASデータセット識別子, 第2引数)」
OPEN関数で開いたSASデータセットの識別子を第1引数に与えます。
また、第2引数にNOBSというキーワードを指定を指定します。
(NOBS以外にも指定できるキーワードはあります。詳しくはまたの機会に。)
最後に、CLOSE関数で開いているSASデータセットを閉じます。
「CLOSE(SASデータセット識別子)」
OPEN関数で開かれたSASデータセットは、そのままだと開かれたままの状態です。
余程の理由がない限り、CLOSE関数で必ず閉じましょう。
実行結果は下記の通りです。
以上。長くなりましたが、3通りの方法を紹介しました。
どれがベストな方法かは答えられません。
- 単純にオブザベーション数を取得するだけなのか
- 一緒に他の処理も行う必要があるのか
- 想定されるデータ(容量)はどれぐらいなのか
これに限ったことではありませんが、
いくつかの手法の中から状況に応じて使い分けることが、理想でありベストな方法なのだと思います。
0 件のコメント:
コメントを投稿