有没有办法在运行时检查 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 数据集的各种其他字符和数字信息。
%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”选项定义了一个变量(这里“eof”表示文件结束),在处理最后一个观察值时设置为 1。然后,您可以测试变量的值,并在其值为 1 时执行操作。有关更多信息,请参阅“set”语句的文档。
data hold;
set input_data end=last;
.
.
.
if last then do;
.
.
.
end;
run;