1. 首页
  2. 自学中心
  3. 软件
  4. SAS

获取数据集的观测值个数

来自 http://bbs.pinggu.org/thread-1540523-1-1.html

使用数据步:
最简单的是使用end选项
data _null_;
set test end=last;
if last then put _n_;
run;

或者是使用nobs选项
data _null_;
set test nobs=nobs;
put nobs=;
stop;
run;

又或者
data _null_;
set test nobs=nobs;
call symputx(“nobs”,nobs);
run;
%put &nobs.;

要注意symputx和symput的区别。
nobs的不足在于当数据集经过修改或带有where选项时,不一定能得出正确结果。
使用SQL语句:
proc sql noprint;
select count(*) into:cot
from test
where x<5;
quit;
%put &cot.;

使用字典(dictionary):
proc sql;
select nobs,nvar
into:nobs,:nvar
from dictionary.tables
where libname=”WORK” and memname=”TEST”;
quit;     

要注意的是,这里work和test必须大写。
使用宏(macro):
%let dsid=%sysfunc(open(test));
%let nvar=%sysfunc(attrn(&dsid,nvars));
%let nobs=%sysfunc(attrn(&dsid,nobs));
%let rc=%sysfunc(close(&dsid));
%put &nvar. &nobs.;
这是最简单的一种情况,更完整的情况必须考虑数据集是否存在,是否能打开,对应宏程序如下:
%macro getobs(data);
%local dsid obsnum rc;
%let dsid=-1;
%if %sysfunc(exist(&data)) %then %let dsid=%sysfunc(open(&data,i));
%if &dsid le 0 %then
%do;
%let obsnum=.;
%put %sysfunc(sysmsg());
%end;
%else
%do;
%let obsnum=%sysfunc(attrn(&dsid,NOBS));
%let rc=%sysfunc(close(&dsid));
%end;
%put &obsnum;
%mend;
%getobs(test);
Jack Hamilton等写了更完整的一种情况,多加入了以下判断程序:
SAS是否能取得观测数?数据集是否还有where选项?%let anobs=%sysfunc(attrn(&DSID,ANOBS));
%let whstmt=%sysfunc(attrn(&DSID,WHSTMT));
%if &anobs=1 & &whstmt=0 %then
%do;
%let counted=%sysfunc(attrn(&DSID,NLOBS));
%end;
否则通过循环计数的方法得到观测数:%let counted=0;
%do %while(%sysfunc(fetch(&DSID))=0);
%let counted=%eval(&counted.+1);
%end;

原创文章,作者:xsmile,如若转载,请注明出处:http://www.17bigdata.com/%e8%8e%b7%e5%8f%96%e6%95%b0%e6%8d%ae%e9%9b%86%e7%9a%84%e8%a7%82%e6%b5%8b%e5%80%bc%e4%b8%aa%e6%95%b0/

联系我们

在线咨询:点击这里给我发消息

邮件:23683716@qq.com

跳至工具栏