楼主: carol1222
4190 17

[原创博文] 关于retain的一个问题 [推广有奖]

11
carol1222 发表于 2012-2-8 15:00:17
zhangzachary 发表于 2012-2-8 14:34
嗯嗯
那我用retain,为什么就是错误的呢?能给我讲讲retain到底要怎么用的不?
花有再开日 人无再少年

12
zhangzachary 发表于 2012-2-8 15:13:00
carol1222 发表于 2012-2-8 15:00
那我用retain,为什么就是错误的呢?能给我讲讲retain到底要怎么用的不?
retain 的翻译就是保留,就是说当retain一个变量,给这个变量赋值后,如果不再去设定改变这个变量,那么对于下一个data step的自循环里沿用这个变量的值,即保留这个值。可以比较以下2个程序:
  1. data a;
  2. do x=1 to 10;
  3. output;
  4. end;
  5. run;

  6. data ret;
  7. set a;
  8. retain r;
  9. if x=1 then r=99;
  10. run;

  11. data no_ret;
  12. set a;
  13. if x=1 then nr=99;
  14. run;
复制代码
寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

13
zhangzachary 发表于 2012-2-8 15:23:46
carol1222 发表于 2012-2-8 15:00
那我用retain,为什么就是错误的呢?能给我讲讲retain到底要怎么用的不?
然后你看你的程序,first.id first.realday 之后设定了start 值,之后没有改变,所以就一直是第一个值,所以做减法之后你得到的是每个值减去第一个值的结果了
寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

14
carol1222 发表于 2012-2-8 15:39:46
zhangzachary 发表于 2012-2-8 15:23
然后你看你的程序,first.id first.realday 之后设定了start 值,之后没有改变,所以就一直是第一个值,所 ...
所以要做两两相减的算法,是不应该用retain的吗?否则怎么每次都retain前面一个值呢?
花有再开日 人无再少年

15
zhangzachary 发表于 2012-2-8 15:49:40
carol1222 发表于 2012-2-8 15:39
所以要做两两相减的算法,是不应该用retain的吗?否则怎么每次都retain前面一个值呢?
要用retain也不是不可以:
data b;
retain start ;
set b;
by id;
if first.id then start=realday;
else do;
dif=realday-start;
start=realday;
end;
run;
这个你试试看,我没测试。
run;
寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

16
carol1222 发表于 2012-2-8 15:59:02
zhangzachary 发表于 2012-2-8 15:49
要用retain也不是不可以:
data b;
retain start ;
[victory] 成功,按照你的方法。那我如果不要first.id,直接变成
data b;
retain start ;
set a;
by id;
data b;
retain start ;
set a;
by id;
/*if first.id then start=realday;*/
/*else do;*/
/*dif=realday-start;*/
/*start=realday;*/
/*end;*/
start=realday;
dif=realday-start;
run;
start=realday;
dif=realday-start;
run;

这样也有retain,但是dif就都是0了,为什么呢?你在first.id的时候,start=realday,else以后,start=realday,不是一样的吗?
花有再开日 人无再少年

17
zhangzachary 发表于 2012-2-8 16:59:17
carol1222 发表于 2012-2-8 15:59
成功,按照你的方法。那我如果不要first.id,直接变成
data b;
retain start ;
不一样,这个是有顺序的,dif 用好上一个start后才可以将start赋值成当前步骤的realday,为了下一个observation准备
寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

18
carol1222 发表于 2012-2-8 17:03:27
zhangzachary 发表于 2012-2-8 16:59
不一样,这个是有顺序的,dif 用好上一个start后才可以将start赋值成当前步骤的realday,为了下一个obser ...
恩恩~~~主要是后台运行,我看来没有很掌握
花有再开日 人无再少年

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

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