有没有办法检查运行时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部分计算observaions的数量,并将该数字存储在名为"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;