有没有办法在运行时检查SAS数据集中有多少观察值,或者是否检测到何时您已经到达DATA步骤中的最后一个观察值?有没有办法在SAS数据步骤中检测到最后一次观察结果?
我似乎无法找到任何网络上的这个看似简单的问题。谢谢!
有没有办法在运行时检查SAS数据集中有多少观察值,或者是否检测到何时您已经到达DATA步骤中的最后一个观察值?有没有办法在SAS数据步骤中检测到最后一次观察结果?
我似乎无法找到任何网络上的这个看似简单的问题。谢谢!
nobs=
选项到set
语句可以给你观察的数量。编译数据步骤时,会扫描输入数据集的标题部分,因此您甚至不必执行set
语句以获取观察值的数目。举例来说,如预期下列报告2:
/* a test data set with two observations and no vars */
data two;
output;
output;
run;
data _null_;
if 0 then set two nobs=nobs;
put nobs=;
run;
/* on log
nobs=2
*/
的end=
选项设置一个标志,当最后一次观察(为set
语句)中读取
一个SAS数据集,但是,可以是。 SAS数据文件或SAS视图。就后者而言,在编译时或执行时可能不知道观察次数。
data subclass/view=subclass;
set sashelp.class;
where sex = symget("sex");
run;
%let sex=F;
data girls;
set subclass end=end nobs=nobs;
put name= nobs= end=;
run;
/* on log
Name=Alice nobs=9.0071993E15 end=0
Name=Barbara nobs=9.0071993E15 end=0
Name=Carol nobs=9.0071993E15 end=0
Name=Jane nobs=9.0071993E15 end=0
Name=Janet nobs=9.0071993E15 end=0
Name=Joyce nobs=9.0071993E15 end=0
Name=Judy nobs=9.0071993E15 end=0
Name=Louise nobs=9.0071993E15 end=0
Name=Mary nobs=9.0071993E15 end=1
*/
查找一个SAS数据组观察结果的数目:
proc sql noprint;
select count(*) into: nobs
from sashelp.class
;
quit;
data _null_;
put "&nobs";
run;
SQL部分计数observaions的数量,并存储在被称为“NOBS”宏变量的数目。 数据步骤将显示数字,但可以像使用其他宏一样使用宏变量。
执行当最后的观察被处理某个动作:即
data _null_;
set sashelp.class end=eof;
if eof then do;
put name= _n_=;
end;
run;
“结束”选项“设置”语句定义(文件结束的-这里“EOF”)的可变在最后一次观察处理时设为1。然后,您可以测试变量的值,并在其值为1时执行操作。有关更多信息,请参阅“set”语句的文档。
感谢这个 - 具有宏变量的选择是绝对方便知道:) – chucknelson 2009-09-29 14:10:26
这些方法的好处是,他们很简单。不足之处在于,如果在具有大量行的数据集上运行时,它们会很慢,因为SAS实际需要遍历数据集以获取结果。一个更好的技术是使用下面的cmjohns显示技术来查询元数据。 – 2012-01-05 09:40:06
@RobPenridge查询元数据确实是一个好方法。请注意,并非所有的数据引擎都支持它,所以最常用的方法是数一数。检测最后一次观察通常是有用的,在这里给出自动eof变量,元数据查询方法将不太优雅。 – 2012-01-07 18:54:20
尽管它仅限于SAS数据集(即不是数据视图),您也可以使用%sysfunc(attrn(dataset, nlobs))
。对宏观信贷this SUGI paper,这也提供了良好的宏观设计信息。
您可以在SAS数据集上获得各种其他字符和数字信息。
%macro numobs (data=&syslast) ;
/* --------------------------------------------
Return number of obs as a function
--------------------------------------------
*/
%local dsid nobs rc;
%let data = &data ; /* force evaluation of &SYSLAST */
%let dsid=%sysfunc(open(&data));
%if &dsid > 0 %then
%do ;
%let nobs=%sysfunc(attrn(&dsid,nlobs));
%let rc=%sysfunc(close(&dsid));
%end ;
%else
%let nobs = -1 ;
&nobs
%mend numobs;
data hold;
set input_data end=last;
.
.
.
if last then do;
.
.
.
end;
run;
感谢这里的众多选项,我现在结束了w/END选项。很高兴看到各种各样的方式来做到这一点:) – chucknelson 2009-09-29 12:42:12