如何在SAS中检测数据集中的观察数量(或者是否为空)?

mj0*_*119 18 sas

我想知道是否有一种检测数据集是否为空的方法,即它没有观察结果.或者在另一种说法中,如何获得特定数据集中的观察数量.

这样我就可以编写一个If语句来设置一些条件.

谢谢.

Lau*_*ick 18

使用PROC SQL很容易.进行计数并将结果放入宏变量中.

proc sql noprint;
 select count(*) into :observations from library.dataset;
quit;
Run Code Online (Sandbox Code Playgroud)

  • 嗨Laurent - 这对于小型数据集来说没问题,但是对于大型数据集,它可能需要很长时间才能执行,因为它必须通读每个观察而不是仅仅查看表的元数据.请参阅下面的一些其他答案,以获得更有效的方法. (5认同)

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)


Rob*_*dge 8

这是@cmjohns谈论的更完整的例子.如果它是空的,它将返回0,如果它是缺失的则返回-1,并且具有处理已删除的观察和where子句的选项(注意使用where子句可以使宏在非常大的数据集上花费很长时间).

使用说明:

此宏将返回数据集中的观察数.如果数据集不存在,则返回-1.我不建议将其用于ODBC libnames,仅针对SAS表使用它.

参数:

  • iDs - libname.dataset您要检查的内容.
  • iWhereClause(可选) - 要应用的where子句
  • iNobsType(可选) -无论是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自动调用库并将此宏放在自动调用位置.