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

时间:2011-04-14 05:37:37

标签: sas

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

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

感谢。

7 个答案:

答案 0 :(得分:18)

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

proc sql noprint;
 select count(*) into :observations from library.dataset;
quit;

答案 1 :(得分: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);

答案 2 :(得分:8)

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

使用说明:

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

参数:

  • iDs - 您要检查的libname.dataset
  • iWhereClause(可选) - 要应用的where子句
  • iNobsType(可选) - NOBSNLOBSF。有关说明,请参阅SASV9 documentation

宏定义:

%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 autocall library并将此宏放在您的自动呼叫位置。

答案 3 :(得分:3)

当我们拥有大型数据集时,proc sql效率不高。虽然使用ATTRN是一种很好的方法,但是这可以在基础sas内完成,这里是一个有效的解决方案,只需读取一行即可给出数十亿行的数量:

data DS1;
set DS nobs=i;
if _N_ =2 then stop;
No_of_obs=i;
run;

答案 4 :(得分:1)

即使数据集为空,技巧也是产生输出。

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可能很棘手,但上面的内容可以用于简单的应用程序。

答案 5 :(得分:1)

略有不同的方法:

read -p "First Value: " f
read -p "Last Value: " l
read -p "Secuence $f to $l ... is correct press <enter> to continue or Ctrl+C to cancel"
for a in {$f..$l..1}
  do
     tr -d '\r' ';'< R*$f.CSV > R*$f_1.CSV

 done

这将为您提供一个观察数据集;变量nobs具有数据集中观察数的值,即使它是0。

答案 6 :(得分:1)

我想我正试图在这里重新发明这么多答案。但我确实看到其他一些方法试图从实际数据集中计算 - 这对于大型数据集可能需要很长时间。这是一种更有效的方法:

proc sql;
select nlobs from sashelp.vtable where libname = "library" and memname="dataset";
quit;