実行時にSASデータセットに含まれるオブザベーションの数を確認する方法、またはDATAステップで最後のオブザベーションに達したことを検出する方法はありますか?
この一見単純な問題については、ウェブ上で何も見つけられないようです。ありがとう!
実行時にSASデータセットに含まれるオブザベーションの数を確認する方法、またはDATAステップで最後のオブザベーションに達したことを検出する方法はありますか?
この一見単純な問題については、ウェブ上で何も見つけられないようです。ありがとう!
ステートメントのnobs=
オプションはset
、観察数を与えることができます。set
データ ステップがコンパイルされると、入力データセットのヘッダー部分がスキャンされるため、観測数を取得するためにステートメントを実行する必要さえありません。たとえば、次のレポートは予想どおり 2 です。
/* a test data set with two observations and no vars */
data two;
output;
output;
run;
data _null_;
if 0 then set two nobs=nobs;
put nobs=;
run;
/* on log
nobs=2
*/
このオプションは、(ステートメントの)end=
最後の観測が読み込まれたときにフラグを設定します。set
ただし、SAS データセットは、SAS データファイルまたは SAS ビューの場合があります。後者の場合、オブザベーションの数は、コンパイル時または実行時にわからない場合があります。
data subclass/view=subclass;
set sashelp.class;
where sex = symget("sex");
run;
%let sex=F;
data girls;
set subclass end=end nobs=nobs;
put name= nobs= end=;
run;
/* on log
Name=Alice nobs=9.0071993E15 end=0
Name=Barbara nobs=9.0071993E15 end=0
Name=Carol nobs=9.0071993E15 end=0
Name=Jane nobs=9.0071993E15 end=0
Name=Janet nobs=9.0071993E15 end=0
Name=Joyce nobs=9.0071993E15 end=0
Name=Judy nobs=9.0071993E15 end=0
Name=Louise nobs=9.0071993E15 end=0
Name=Mary nobs=9.0071993E15 end=1
*/
%sysfunc(attrn( dataset, nlobs))
SAS データセット (データビューではない) に限定されますが、使用することもできます。優れたマクロ設計に関する優れた情報も提供する、この SUGI 論文のマクロの功績です。
SAS データセットに関するその他のあらゆる種類の文字および数値情報を取得できます。
attrnおよびattrcのドキュメントを参照してください。
%macro numobs (data=&syslast ) ;
/* --------------------------------------------
Return number of obs as a function
--------------------------------------------
*/
%local dsid nobs rc;
%let data = &data ; /* force evaluation of &SYSLAST */
%let dsid=%sysfunc(open(&data));
%if &dsid > 0 %then
%do ;
%let nobs=%sysfunc(attrn(&dsid,nlobs));
%let rc=%sysfunc(close(&dsid));
%end ;
%else
%let nobs = -1 ;
&nobs
%mend numobs;
SAS データセット内の観測数を求めます。
proc sql noprint;
select count(*) into: nobs
from sashelp.class
;
quit;
data _null_;
put "&nobs";
run;
SQL 部分は観測の数をカウントし、その数を「nobs」と呼ばれるマクロ変数に格納します。データ ステップは表示用の数値を配置しますが、マクロ変数は他のものと同じように使用できます。
最後の観測が処理されたときに特定のアクションを実行する:
data _null_;
set sashelp.class end=eof;
if eof then do;
put name= _n_=;
end;
run;
「set」ステートメントの「end」オプションは、最後の観測が処理されるときに 1 に設定される変数 (ここではファイルの終わりを表す「eof」) を定義します。You can then test the value of the variable, and perform actions when its value is 1. 詳細については、"set" ステートメントのドキュメントを参照してください。
data hold;
set input_data end=last;
.
.
.
if last then do;
.
.
.
end;
run;