我想知道是否有一种检测数据集是否为空的方法,即它没有观察结果。 或者在另一个说法中,如何获得特定数据集中的观察数量。
这样我就可以编写一个If语句来设置一些条件。
感谢。
答案 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表使用它。
参数:
libname.dataset
。NOBS
或NLOBSF
。有关说明,请参阅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;