楼主: zkp216
20268 12

[学习分享] 获取数据集的观测值个数-转 [推广有奖]

  • 4关注
  • 2粉丝

硕士生

38%

还不是VIP/贵宾

-

威望
0
论坛币
246 个
通用积分
0
学术水平
1 点
热心指数
5 点
信用等级
1 点
经验
1857 点
帖子
103
精华
0
在线时间
159 小时
注册时间
2012-6-18
最后登录
2021-12-10

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
使用数据步:
最简单的是使用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;



二维码

扫码加我 拉你入群

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

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

关键词:观测值 数据集 proc sql symput Select

已有 1 人评分热心指数 收起 理由
eijuhz + 2 精彩帖子

总评分: 热心指数 + 2   查看全部评分

本帖被以下文库推荐

沙发
zhentao 发表于 2012-8-6 08:37:16 |只看作者 |坛友微信交流群
呵呵,有心人。
学习了。非常感谢。

使用道具

多谢~~~~学习了~~~

使用道具

板凳
kittyforever 发表于 2013-1-17 09:17:40 |只看作者 |坛友微信交流群
正好需要, 谢谢楼主分享

使用道具

报纸
soporaeternus 发表于 2013-1-17 09:22:17 |只看作者 |坛友微信交流群
带stop的和直接读元数据的比较好,否则会很慢
Let them be hard, but never unjust

使用道具

地板
henryyhl 发表于 2013-1-17 10:01:41 |只看作者 |坛友微信交流群
学习。谢谢
It's not going to be easy, but it is going to be worth it.

使用道具

7
sunset1986 发表于 2013-1-17 10:12:45 |只看作者 |坛友微信交流群
学习了
An honest tale speeds best being plainly told.
Cheers!

使用道具

8
lily83322 发表于 2013-1-17 10:20:22 |只看作者 |坛友微信交流群
谢谢楼主

使用道具

9
hhftheone 在职认证  发表于 2013-3-13 12:53:50 |只看作者 |坛友微信交流群
学习了
路过的风景就不再回头

使用道具

10
congmu 发表于 2014-4-26 21:41:52 |只看作者 |坛友微信交流群
请问这里的stop是什么语句的?为什么要加这个
data _null_;
set test nobs=nobs;
put nobs=;
stop;
run;

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 17:43