楼主: yzsxdlcc
12294 11

[问答] 如何取出这个数据里面的最后一条记录? [推广有奖]

  • 9关注
  • 2粉丝

已卖:3份资源

博士生

17%

还不是VIP/贵宾

-

TA的文库  其他...

sas

威望
0
论坛币
3013 个
通用积分
0
学术水平
3 点
热心指数
3 点
信用等级
3 点
经验
14694 点
帖子
71
精华
0
在线时间
434 小时
注册时间
2012-5-26
最后登录
2021-1-15

楼主
yzsxdlcc 发表于 2013-1-6 17:39:26 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
  1. data test;
  2. input type $1. @;
  3. retain address;
  4. if type='H' then do;
  5. if _n_>1 then output;
  6. total=0;
  7. input address $3-17;
  8. end;
  9. else if type='P' then total+1;
  10. cards;
  11. H zd2
  12. H sdf
  13. P mark
  14. P mark
  15. H a21a
  16. P mark
  17. H a21z
  18. P mark
  19. P mark
  20. P mark
  21. H a21sdf
  22. ;
  23. run;
复制代码


上面的程序运行结果:

obs   type   address   total
1        H      zd2           0
2        H      sdf            0
3        H      a21a         1
4        H      a21z         3

上面的程序,type=H代表地址,P代表的是在它之前的这个地址的详细信息。
程序是为了统计在某个H地址下面的人口数量。

现在的问题是,数据集里面有5个H,结果跑完只给了4个,最后一个H a21sdf被忽略了。

我尝试在程序里
  1. else if type='P' then total+1
复制代码

多添加了一句
  1. if last.type then output;
复制代码





可是结果依然取不出来。
日志显示last未初始化。使用last数据集需要先排序,是排序的话,数据集的顺序就打乱了。

我又试着把
  1. if last.type then output
复制代码


改为 :
  1. if _n_=11 then output
复制代码


(因为有11条记录)
结果显示为:

obs   type   address   total
1        H      zd2           0
2        H      sdf            0
3        H      a21a         1
4        H      a21z         3

5        H      a21sdf      0


这是我想要的结果。


但是不可能每次都去数一个数据集的记录条数是多少条。。


所以,请问各位大牛有没有什么方法解决这个问题?




二维码

扫码加我 拉你入群

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

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

关键词:address output RETAIN Total outpu 记录 如何

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 36 + 60 + 2 + 2 + 2 精彩帖子
playmore + 1 + 1 + 1 精彩帖子

总评分: 经验 + 36  论坛币 + 60  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

本帖被以下文库推荐

从骨感走向丰满

文库

沙发
playmore 发表于 2013-1-6 18:26:36
你把
if _n_>1 then
去掉就好了啊
不知道你加这个判断是干什么的
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

藤椅
Imasasor 发表于 2013-1-6 18:48:16
看你程序看了半天,感慨你对input指针和输出控制的如此精妙。
我没有办法在你原来的代码上解决你的问题,试了一下infile的eof=label,弄了半天没试出来,没用过这个选项。所以为什么不先把数据读入,再想办法处理呢,不一定非要在input的时候弄好他
  1. data b;
  2. set a;
  3. n=_n_;
  4. run;
  5. proc sort data=b;
  6. by descending n;
  7. run;
  8. data c;
  9. set b;
  10. retain num;
  11. if type="H" and lag(type)^="P" then num=0;
  12. if first.type and type="P" then num=1;
  13. else if type="P" then num+1;
  14. if type="H" then output;
  15. by type notsorted;
  16. run;
  17. proc sort data=c;
  18. by n;
  19. run;
  20. data c;
  21. set c(drop=n);
  22. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
yzsxdlcc + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

板凳
Imasasor 发表于 2013-1-6 18:54:42
playmore 发表于 2013-1-6 18:26
你把
if _n_>1 then
去掉就好了啊
playmore,你可能没理解他的意图,他这段代码写的很精妙的,因为他是要统计每个H后面P的观测数,而sas是逐行读取数据的,所以用了retain,还有把output放到一个合适的位置,我觉得写得很好的,但是最后一个观测没办法
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

报纸
老师她摸我 发表于 2013-1-6 19:22:32
数据存为外部文件就好,你的结果描述不对吧!
  1. data test;
  2.         infile raw end=last truncover;
  3.         input type $1. @;
  4.         retain address;
  5.         if type='H' then do;
  6.                  if _n_>1 then output;
  7.                          total=0;
  8.                          input address $3-17;
  9.          end;
  10.                 else if type='P' then total+1;
  11.         if last then output;
  12. run;
复制代码

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
yzsxdlcc + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

欢迎加入SAS群:144839730-蜗牛

地板
webgu 发表于 2013-1-6 19:55:34
  1. filename  myfile 'd:\tst.txt';

  2. data test;
  3. infile myfile  end=last;
  4. input type $@;
  5. retain address;
  6. if type='H' then do;
  7. if _n_>1 then output;
  8. total=0;
  9. input address $;
  10. end;
  11. else if type='P' then total+1;
  12. if last then output;
  13. run;

  14. proc print data=test;
  15. run;
复制代码
Obs  type  address total
1    H         zd2    0
2   H         sdf     2
3   H        a21a   1
4  H         a21z    3
5  H        a21sdf     0
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
yzsxdlcc + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

7
playmore 发表于 2013-1-6 20:17:29
Imasasor 发表于 2013-1-6 18:54
playmore,你可能没理解他的意图,他这段代码写的很精妙的,因为他是要统计每个H后面P的观测数,而sas是逐 ...
嗯,我仔细学习了下,果然精妙
分步读观测啊,retain address啊,太nb了

另如果不infile外部文件的话,是没有eof的
变通的做法就是在datalines的最后一行加一个H作为终止符
这样就行了

我感觉lz这是上来考大家的
bz上来加个精吧
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

8
ziyenano 发表于 2013-1-6 21:10:38
这样读的话,最后一条必然不会出现的,以test第一条记录为例H zd2,
这里的H其实是第二行记录中H sdf的H,当读到最后一行记录的H的时候,
retain中的address仍然保留的是第6行的a21a,最后输出的是H a21a,
此时虽然address读入a21sdf,但是指针已经到最后,不会再有观测输出,
在程序中加一个n=_n_就会一目了然了。
如果要输出最后一行的a21sdf,可以在最后一行再加一个H

data test;
input type $1. @;
retain address;
if type='H' then do;
if _n_>1 then output;
total=0;
input address $3-17;
end;
else if type='P' then total+1;
cards;
H zd2
H sdf
P mark
P mark
H a21a
P mark
H a21z
P mark
P mark
P mark
H a21sdf
H
;
run;
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
yzsxdlcc + 1 + 1 + 1 观点有启发
pobel + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

9
yzsxdlcc 发表于 2013-1-7 08:38:16
老师她摸我 发表于 2013-1-6 19:22
数据存为外部文件就好,你的结果描述不对吧!
结果打错了。
从骨感走向丰满

文库

10
yzsxdlcc 发表于 2013-1-7 08:55:25
ziyenano 发表于 2013-1-6 21:10
这样读的话,最后一条必然不会出现的,以test第一条记录为例H zd2
这里的H其实是第二行记录中H sdf的H,当 ...
  1. data test;
  2. input type $1. @;
  3. retain address;
  4. n=_n_;
  5. if type='H' then do;
  6. if _n_>1 then output;
  7. total=0;
  8. input address $3-17;
  9. end;
  10. else if type='P' then total+1;
  11. cards;
  12. H zd2
  13. H sdf
  14. P mark
  15. P mark
  16. H a21a
  17. P mark
  18. H a21z
  19. P mark
  20. P mark
  21. P mark
  22. H a21sdf
  23. H
  24. ;
  25. run;
复制代码
结果:
Obs  type  address    n total
1      H         zd2        2      0
2      H         sdf         5      2
3      H         a21a       7     1
4      H         a21z      11     3
5      H         a21sdf   12     0

添加了n=_n_来查看取出来的各个H时_n_的位置,确实如ziyenano这般。
从骨感走向丰满

文库

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-4 02:06