【问题标题】:An automated way to use SAS Lag Function/ Loop with Lag?使用 SAS Lag Function/Loop with Lag 的自动化方式?
【发布时间】:2017-05-29 14:19:41
【问题描述】:

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

如果该周的 flag=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,这将变得非常乏味。

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

非常感谢任何帮助。

【问题讨论】:

    标签: sql loops sas lag


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      您也可以使用临时数组来保留滞后信息,然后捕获数组的最高值。如果它是一个,那么您也可以将新标志设置为 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多