Sql 自动使用SAS滞后功能/滞后循环的方法?
我有一个数据集,2年内每周一行(共104行)。我有一个每周为1或0的标志列。我想用以下逻辑创建一个新列: 如果该周的标志=1,则该周和随后3周的标志为1 我目前有效的方法是:Sql 自动使用SAS滞后功能/滞后循环的方法?,sql,loops,sas,lag,Sql,Loops,Sas,Lag,我有一个数据集,2年内每周一行(共104行)。我有一个每周为1或0的标志列。我想用以下逻辑创建一个新列: 如果该周的标志=1,则该周和随后3周的标志为1 我目前有效的方法是: if flag=1 or lag(flag)=1 or lag2(flag)=1 or lag3(flag)=1 then flag_new=1; 虽然这是可行的,但如果我希望flag_new在接下来的20或30周内为1,而不是仅为3周,这将变得非常乏味 我希望有一个更简单的方法来做这件事(也许是一个循环?),但我不太熟
if flag=1 or lag(flag)=1 or lag2(flag)=1 or lag3(flag)=1 then flag_new=1;
虽然这是可行的,但如果我希望flag_new在接下来的20或30周内为1,而不是仅为3周,这将变得非常乏味
我希望有一个更简单的方法来做这件事(也许是一个循环?),但我不太熟悉它
非常感谢您的帮助 与其回顾过去,不如把它看作是向前看。也就是说,每次看到flag=1时,为该记录和接下来的三条记录设置flag_new=1。类似于(未经测试):
您还可以使用临时数组来保留滞后信息,然后捕获数组中的最高值。如果是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;
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;