一种使用 SAS Lag Function/Loop with Lag 的自动化方法?

An automated way to use SAS Lag Function/ Loop with Lag?

我有一个数据集,每周一行,持续 2 年(所以 104 行)。我有一个标志列,每周为 1 或 0。我想创建一个具有以下逻辑的新列:

如果那一周的标志=1,那么那一周和接下来的 3 周都有 1 作为 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,这将变得非常乏味。

我希望有更简单的方法(也许是循环?),但我不太熟悉它。

非常感谢任何帮助。

也许与其回顾过去,不如将其视为展望未来。也就是说,每次看到 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。要更改尺寸,只需将 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;