全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
21435 12
2012-08-03
使用数据步:
最简单的是使用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;



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-8-6 08:37:16
呵呵,有心人。
学习了。非常感谢。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-8-6 08:48:31
多谢~~~~学习了~~~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-17 09:17:40
正好需要, 谢谢楼主分享
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-17 09:22:17
带stop的和直接读元数据的比较好,否则会很慢
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-17 10:01:41
学习。谢谢
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群