楼主: 2286116865
9879 10

[问答] 请教retain语句 [推广有奖]

  • 2关注
  • 4粉丝

讲师

16%

还不是VIP/贵宾

-

威望
0
论坛币
367 个
通用积分
1.7284
学术水平
1 点
热心指数
6 点
信用等级
1 点
经验
7033 点
帖子
294
精华
0
在线时间
294 小时
注册时间
2015-5-3
最后登录
2024-1-1

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
比如:我想以id分组,计算income的和,以下为此写的一段程序,大家帮忙看看有什么问题吗?,date set new_sample 并没有出来理想的结果。先谢谢大家了!
data sample;                                                                                                                           
input ID$ type income @@;                                                                                                               
cards;                                                                                                                                 
1 1 200 1 2 300 1 3 100 2 1 200 2 3 100 2 4 100                                                                                         
;                                                                                                                                       
run;                                                                                                                                    
data new_sample;                                                                                                                        
set sample;                                                                                                                             
by id;                                                                                                                                 
retain new_income;                                                                                                                     
if first.id then do;                                                                                                                    
new_income=0;                                                                                                                           
new_income+income;                                                                                                                     
if last.id then out new_sample;                                                                                                         
run;  


二维码

扫码加我 拉你入群

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

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

关键词:RETAIN ETA RET Income Sample income 程序

回帖推荐

wwang111 发表于9楼  查看完整内容

首先,sum(new_income,income)这个地方,sum是一个函数,而不是一个语句,函数只行使相加的功能,而语句才有自动retain的功能,仔细看一下我刚才给你的pdf,sum语句的形式是variable+expression; 对于retain,你可以这样理解:你定义了一个变量并且retain,是告诉PDV,这个变量在每一次程序执行之前,不要重新设为空值,而是保留上一条记录执行结束时候的值。 sample4里面,first.id的时候,new_income=sum(new_income,incom ...
沙发
wwang111 发表于 2016-8-5 19:30:18 |只看作者 |坛友微信交流群
我感觉这样写比较好,你自己再结合程序慢慢体会一下:

data new_sample;                                                                                                                        
set sample;                                                                                                                             
by id;                                                                                                                                 
if first.id then new_income=0;                                                                                                                           
new_income+income;  
if last.id;     
keep id new_income;
run;

使用道具

藤椅
zjtj12 发表于 2016-8-5 19:51:23 |只看作者 |坛友微信交流群
在你的程序上略微改动如下:
  1. data sample;                                                                                                                           
  2. input ID$ type income @@;                                                                                                               
  3. cards;                                                                                                                                 
  4. 1 1 200 1 2 300 1 3 100 2 1 200 2 3 100 2 4 100
  5. ;                                                                                                                                       
  6. run;                                                                                                                                    
  7. data new_sample;                                                                                                                        
  8. set sample;                                                                                                                             
  9. by id;                                                                                                                                 
  10. retain new_income;                                                                                                                     
  11. if first.id then new_income=0;                                                                                                                           
  12. new_income+income;                                                                                                                     
  13. if last.id then output new_sample;
  14. run;  
复制代码

使用道具

板凳
2286116865 发表于 2016-8-5 20:52:33 |只看作者 |坛友微信交流群
老师,我这个语句:  if last.id then out new_sample;  有问题吗?因为当改为  :if last.id;run; 后就能跑出结果了;
其实自己本来还想借此学习一下retain语句的,为什么这里没有retain new_income 也照样跑出正确的结果,我觉得如果没有了retain 那么的jisua计算的不是累加id的income之和吗?难道是因为有了run语句,所以PDV中各个变量又被赋予缺失值?                                                                                                                                                                                                        

使用道具

报纸
2286116865 发表于 2016-8-5 21:02:11 |只看作者 |坛友微信交流群
wwang111 发表于 2016-8-5 19:30
我感觉这样写比较好,你自己再结合程序慢慢体会一下:

data new_sample;                               ...
老师,我这个语句:  if last.id then out new_sample;  有问题吗?因为当改为  :if last.id;run; 后就能跑出结果了;
其实自己本来还想借此学习一下retain语句的,为什么这里没有retain new_income 也照样跑出正确的结果,我觉得如果没有了retain 那么的jisua计算的不是累加id的income之和吗?难道是因为有了run语句,所以PDV中各个变量又被赋予缺失值?  

使用道具

地板
wwang111 发表于 2016-8-5 21:17:51 |只看作者 |坛友微信交流群
if last.id then out new_sample; 应该是 if last.id then output new_sample; 因为你的数据集名字本身就是new_sample,所以不加output也能输出名字是new_sample的数据集;

new_income+income; 这是 sum statement,本身就有retain的功能,跟run没关系,run只是这条记录执行完毕,回到data开始下一条记录的执行的一个标志。

这样写可以体现一下retain的作用,这时候new_income=new_income+income; 就是一个普通的算式,而不是sum statement了,:
data new_sample;                                                                                                                        
set sample;                                                                                                                             
by id;
retain new_income;
if first.id then new_income=income;                                                                                                                           
else new_income=new_income+income;  
if last.id;     
keep id new_income;
run;

sum statement.pdf

147.03 KB

使用道具

7
2286116865 发表于 2016-8-5 22:01:03 |只看作者 |坛友微信交流群
zjtj12 发表于 2016-8-5 19:51
在你的程序上略微改动如下:
理想的结果出来了,谢谢~
我刚改动了下:data sample;                                                                                                                                             
data new_sample4;                                                                                                                                       
set sample;                                                                                                                                             
by id;                                                                                                                                                   
if first.id then new_income=0;                                                                                                                        
new_income=sum(new_income,income);                                                                                                                       
if last.id ;                                                                                                                                             
run;  ,   
结果是:id=1或2时 new_income 结果均为100,
data new_sample5;                                                                                                                                       
set sample;                                                                                                                                             
by id;                                                                                                                                                   
retain new_income;                                                                                                                                       
if first.id then new_income=0;                                                                                                                           
new_income=sum(new_income,income);                                                                                                                       
if last.id ;                                                                                                                                             
run;
结果是:id=1时 new_income=600
id=2时 new_incom=400;
想请问retain到底是在那一步开始执行的,我认为个观测都执行,但是为什么好像只有在id=1  所有的观测读完之后再执行一遍?好晕那,老师帮我解释一下吧,谢谢~

使用道具

8
2286116865 发表于 2016-8-5 22:13:56 |只看作者 |坛友微信交流群
wwang111 发表于 2016-8-5 21:17
if last.id then out new_sample; 应该是 if last.id then output new_sample; 因为你的数据集名字本身就是 ...
老师,根据你的指导,我写了如下代码,结果是:id=1或2时 new_income 结果均为100,似乎对retain语句还有sum语句更加了解了,谢谢老师!
data sample;                                                                                                                                             
input ID$ type income @@;                                                                                                                                
cards;                                                                                                                                                   
1 1 200 1 2 300 1 3 100 2 1 200 2 3 100 2 4 100                                                                                                         
;                                                                                                                                                        
run;
data new_sample4;                                                                                                                                       
set sample;                                                                                                                                             
by id;                                                                                                                                                   
if first.id then new_income=0;                                                                                                                        
new_income=sum(new_income,income);                                                                                                                       
if last.id ;                                                                                                                                             
run;  

使用道具

9
wwang111 发表于 2016-8-5 22:26:06 |只看作者 |坛友微信交流群
首先,sum(new_income,income)这个地方,sum是一个函数,而不是一个语句,函数只行使相加的功能,而语句才有自动retain的功能,仔细看一下我刚才给你的pdf,sum语句的形式是variable+expression;

对于retain,你可以这样理解:你定义了一个变量并且retain,是告诉PDV,这个变量在每一次程序执行之前,不要重新设为空值,而是保留上一条记录执行结束时候的值。

sample4里面,first.id的时候,new_income=sum(new_income,income);执行结束之后,new_income的值是200,继续读第二条记录的时候,200就会被初始化为空值,所以每一条记录的new_income只是这些记录的income的值;

sample5的程序就可以体现retain的功能了,first.id的时候,new_income=sum(new_income,income);执行结束之后,new_income的值是200,继续读第二条记录的时候,200不会被初始化为空值,所以可以累积相加。

使用道具

10
2286116865 发表于 2016-8-6 10:04:21 |只看作者 |坛友微信交流群
wwang111 发表于 2016-8-5 22:26
首先,sum(new_income,income)这个地方,sum是一个函数,而不是一个语句,函数只行使相加的功能,而语句才有 ...
谢谢老师,理解了,哈哈,pdf这就去看,还没认真学习sum函数和语句呢!

使用道具

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

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

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

GMT+8, 2024-4-27 07:35