一种使用 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;
我有一个数据集,每周一行,持续 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;