前面行中的SAS最大值

时间:2016-07-28 22:08:26

标签: sas max rows retain

我需要计算每个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

2 个答案:

答案 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