如何在SAS中检测数据集中有多少个观测值(如果为空)?

| 我想知道是否有一种方法可以检测数据集是否为空,即没有观测值。 换句话说,如何获取特定数据集中的观测值数量。 这样我就可以编写If语句来设置一些条件。 谢谢。     
已邀请:
使用PROC SQL很容易。进行计数并将结果放入宏变量中。
proc sql noprint;
 select count(*) into :observations from library.dataset;
quit;
    
有很多不同的方法,我倾向于使用带有with1ѭ和
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);
    
这是@cmjohns在谈论的更完整的示例。如果为空,它将返回0;如果为空,它将返回-1;它具有处理删除的观察值和where子句的选项(请注意,使用where子句会使宏在非常大的数据集上花费很长时间)。 使用注意事项: 此宏将返回数据集中的观察数。如果数据集不存在,则将返回-1。我不建议将其与ODBC libname一起使用,仅将其用于SAS表。 参数: ID-您要检查的
libname.dataset
。 iWhereClause(可选)-适用的where子句 iNobsType(可选)-
NOBS
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;
用法示例:
%put %nobs(iDs=sashelp.class);
%put %nobs(iDs=sashelp.class, iWhereClause=height gt 60);
%put %nobs(iDs=this_dataset_doesnt_exist);
结果
19
12
-1
安装 我建议设置SAS自动调用库,并将此宏放在您的自动调用位置。     
当我们有大量数据集时,proc SQL效率不高。尽管使用ATTRN是一种好方法,但是这可以在基本的sas内完成,但这是一种有效的解决方案,仅通过读取一行就可以给出数十亿行的obs数:
data DS1;
set DS nobs=i;
if _N_ =2 then stop;
No_of_obs=i;
run;
    
诀窍是即使数据集为空也要产生输出。
data CountObs;

    i=1;
    set Dataset_to_Evaluate point=i nobs=j; * \'point\' avoids review of full dataset*;
    No_of_obs=j;
    output;  * Produces a value before \"stop\" interrupts processing *;
    stop;   * Needed whenever \'point\' is used *;
    keep No_of_obs;
run;

proc print data=CountObs;
run;
上面的代码是我发现即使在数据集为空时也能产生观察值数量的最简单方法。我听说过NOBS可能很棘手,但以上内容可用于简单的应用程序。     
稍微不同的方法:
proc contents data=library.dataset out=nobs;
run;

proc summary data=nobs nway;
class nobs;
var delobs;
output out=nobs_summ sum=;
run;
这将为您提供一个观测值的数据集。变量nobs在数据集中具有观测值个数的值,即使它是0。     
我想我已经尝试用很多答案在这里重新发明轮子了。但是,我确实看到了其他一些尝试从实际数据集中进行计数的方法-对于大型数据集,这可能需要很长时间。这是一种更有效的方法:
proc sql;
select nlobs from sashelp.vtable where libname = \"library\" and memname=\"dataset\";
quit;
    

要回复问题请先登录注册