作者tew (咖啡王子)
站内Statistics
标题Re: [程式] SAS IF/ELSE RETAIN 观念问题
时间Sun Jan 29 00:40:14 2012
※ 引述《bbearh (go)》之铭言:
: 又来请教板上大大.
: 有关data process 过程,
: 本觉得已经懂了. 但是有时结果仍不是我想像的.
: 如果可能的话, 帮我解释这样写为什麽不对.
: data ddd;
: input id name$ vol ;
: cards;
: 1 A 10
: 1 A 12
: 1 A 9
: 1 A 3
: 2 B 4
: 2 B 5
: 2 B 6
: 2 B 7
: 8 C 1
: 8 C 1
: 8 C 1
: ;
: run;
: *算分组累积和;
: data eee;
: set ddd;
: retain acc 0;
: * acc=-10000;
: if id^=lag(id) then do;
: acc=vol;
: end;
: else if id=lag(id) then
: acc=acc+vol;
: else
: acc=-999; <--- 第2 row 为何会跑到这case
: run;
: * if else then do end 这样写没错吧! 已被data弄得没什麽信心
: * retain 的使用目的是什麽? 觉得自己的观念还是模糊的.
: ---------------------------------
基本上 if then do end的观念都没错
retain 的观念也对
但是就差在 retain这个语法 本身就是保留数值给下一个观察值使用
本身已经具有lag function的意味在
当你在if then 的语法中使用了 lag function来改变时
会变成 跳两个观察值使用
retain imply one lag (就我个人使用的看法)
因此 要下条件
通常都针对 第一个数据做调整即可
data eee;
set ddd;
retain acc 0;
acc=acc+vol;
if id^=lag(id) then acc=vol;
run;
以这样来做
acc会不断累加 但是满足 id^=lag(id)时 就会回到vol值重新计算
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.250.118.48
1F:推 bbearh:所以真的会跳两个观察值, 以後要避免这种写法. THANKS 01/29 10:45