我需要计算每个ID和月的最近3个月的max(Measure),而不使用PROC SQL。我想知道我可以使用RETAIN语句执行此操作,但是我不知道如何实现条件比较当前行和前两行中的Measure值。
我还需要准备以上超过3个月的时间,因此任何不需要每个月额外步骤的解决方案都绝对值得赞赏!
以下是我的数据:
data have;
input month ID $ measure;
cards;
201501 A 0
201502 A 30
201503 A 60
201504 A 90
201505 A 0
201506 A 0
201501 B 0
201502 B 30
201503 B 0
201504 B 30
201505 B 60
;
这是我需要的那个:
data want;
input month ID $ measure max_measure_3m;
cards;
201501 A 0 0
201502 A 30 30
201503 A 60 60
201504 A 90 90
201505 A 0 90
201506 A 0 90
201501 B 0 0
201502 B 30 30
201503 B 0 30
201504 B 30 30
201505 B 60 60
;
And here both tables: the one I have on the left and the one I need on the right
答案 0 :(得分:1)
您可以使用与移动窗口大小相同的数组来执行此操作。我不确定在窗口方面你需要什么类型的动态代码。如果您需要在3个月之前的4或5个月的最大值,那么我建议使用PROC EXPAND
而不是这些方法。 PROC EXPAND
的文档就是如何做到这一点的一个很好的例子。
data want;
set have;
by id;
array _prev(0:2) _temporary_;
if first.id then
do;
call missing (of _prev(*));
count=0;
end;
count+1;
_prev(mod(count, 3))=measure;
max=max(of _prev(*));
drop count;
run;
proc expand data=test out=out method=none;
by id;
id month;
convert x = x_movave3 / transformout=(movave 3);
convert x = x_movave4 / transformout=(movave 4);
run;
答案 1 :(得分:0)
试试这个:
append/3