使用带有滞后的SAS延迟功能/循环的自动方式?

时间:2017-05-29 14:19:41

标签: sql loops sas lag

我有一个数据集,每周有一行,为期2年(因此有104行)。我有一个标志列,每周1或0。我想用以下逻辑创建一个新列:

如果该周的标志= 1,则该周为1,接下来的3周为flag_new。

我目前使用的方法是:

if flag=1 or lag(flag)=1 or lag2(flag)=1 or lag3(flag)=1 then flag_new=1;

虽然这有效但如果我希望flag_new在接下来的20周或30周而不是仅仅3周内变为1,那将变得非常繁琐。

我希望有一种更简单的方法可以做到这一点(也许是一个循环?),但我对它并不太熟悉。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

也许不是回顾过去,而是将其视为未来。也就是说,每次看到flag = 1时,为该记录和接下来的三个记录设置flag_new = 1。像(未经测试)的东西:

if flag=1 then count=3;
else count+(-1) ; *implicit retain from sum statement;

if count>=0 then flag_new=1;

答案 1 :(得分:0)

您也可以使用临时数组来保留滞后信息,然后捕获最高的数组。如果它是一个,那么你也可以将新标志设置为1。要更改尺寸,只需将2更改为您需要的n-1。

这也演示了BY语句并将其重置为新组的开头。

data want;

 array p{0:2} _temporary_;

 set have;
 by object;

if first.object then call missing(of p{*});
p{mod(_n_,4)} = flag;
highest = max(of p{*});

if highest > 1 then do;
    flag_new = 1;
end;
run;