我想知道是否有一种检测数据集是否为空的方法,即它没有观察结果.或者在另一种说法中,如何获得特定数据集中的观察数量.
这样我就可以编写一个If语句来设置一些条件.
谢谢.
Lau*_*ick 18
使用PROC SQL很容易.进行计数并将结果放入宏变量中.
proc sql noprint;
select count(*) into :observations from library.dataset;
quit;
Run Code Online (Sandbox Code Playgroud)
cmj*_*hns 14
有很多不同的方式,我倾向于使用具有微距功能open()和attrn().下面是一个在大多数情况下都很有效的简单示例.如果您要处理数据视图或更复杂的情况,例如将数据集标记为删除或活动where子句,那么您可能需要更强大的逻辑.
%macro nobs(ds);
%let DSID=%sysfunc(OPEN(&ds.,IN));
%let NOBS=%sysfunc(ATTRN(&DSID,NOBS));
%let RC=%sysfunc(CLOSE(&DSID));
&NOBS
%mend;
/* Here is an example */
%put %nobs(sashelp.class);
Run Code Online (Sandbox Code Playgroud)
这是@cmjohns谈论的更完整的例子.如果它是空的,它将返回0,如果它是缺失的则返回-1,并且具有处理已删除的观察和where子句的选项(注意使用where子句可以使宏在非常大的数据集上花费很长时间).
使用说明:
此宏将返回数据集中的观察数.如果数据集不存在,则返回-1.我不建议将其用于ODBC libnames,仅针对SAS表使用它.
参数:
libname.dataset您要检查的内容.NOBSOR NLOBSF.有关说明,请参阅SASV9文档.宏定义:
%macro nobs(iDs=, iWhereClause=1, iNobsType=nlobsf, iVerbose=1);
%local dsid nObs rc;
%if "&iWhereClause" eq "1" %then %do;
%let dsID = %sysfunc(open(&iDs));
%end;
%else %do;
%let dsID = %sysfunc(open(&iDs(where=(&iWhereClause))));
%end;
%if &dsID %then %do;
%let nObs = %sysfunc(attrn(&dsID,nlobsf));
%let rc = %sysfunc(close(&dsID));
%end;
%else %do;
%if &iVerbose %then %do;
%put WARNING: MACRO.NOBS.SAS: %sysfunc(sysmsg());
%end;
%let nObs = -1;
%end;
&nObs
%mend;
Run Code Online (Sandbox Code Playgroud)
用法示例:
%put %nobs(iDs=sashelp.class);
%put %nobs(iDs=sashelp.class, iWhereClause=height gt 60);
%put %nobs(iDs=this_dataset_doesnt_exist);
Run Code Online (Sandbox Code Playgroud)
结果
19
12
-1
Run Code Online (Sandbox Code Playgroud)
安装
我建议设置SAS自动调用库并将此宏放在自动调用位置.