我是一名 SAS 初学者,我很好奇以下任务是否可以像目前在我脑海中那样简单得多。
我在名为 user_date_money 的表中有以下(简化的)元数据:
用户 - 日期 - 金钱
每个日历日(过去 4 年)都有不同的用户和日期。数据按用户 ASC 和日期 ASC 排序,示例数据如下所示:
User | Date | Money
Anna 23.10.2013 5
Anna 24.10.2013 1
Anna 25.10.2013 12
....
Aron 23.10.2013 5
Aron 24.10.2013 12
Aron 25.10.2013 4
....
Zoe 23.10.2013 1
Zoe 24.10.2013 1
Zoe 25.10.2013 0
我现在想计算货币的五天移动平均线。我从非常流行的带有 lag() 函数的方法开始,如下所示:
data cma;
set user_date_money;
if missing(money) then
do;
OBS = 0;
money = 0.0;
end;
else OBS = 1;
money5 = lag5(money);
OBS5= lag5(obs);
if missing(money5) then money5= 0.0;
if missing(obs5) then obs5= 0;
if _N_ = 1 then
do;
SUM = 0.0;
N = 0;
end;
else;
sum = sum + money-money5;
n = n + obs-obs5;
MEAN = sum / n ;
retain sum n;
run;
如您所见,如果数据步骤遇到新用户,则会出现此方法的问题。Aron 会从 Anna 那里得到一些滞后值,这当然不应该发生。
现在我的问题:我很确定您可以通过添加一些额外的字段(如 laaggeduser)来处理用户切换,如果您注意到这样的切换,则可以通过重置 N、Sum 和 Mean 变量来处理,但是:
这可以以更简单的方式完成吗?也许以任何方式使用 BY 子句?感谢您的想法和帮助!
此致