我有一个数据集,每周有一行,为期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,那将变得非常繁琐。
我希望有一种更简单的方法可以做到这一点(也许是一个循环?),但我对它并不太熟悉。
非常感谢任何帮助。
答案 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;