如何根据 SAS 中先前行的条件添加标志

How to add a flag based on a condition on previous rows in SAS

我有以下数据,如果在前一行中满足条件,我想在每一行中添加一个标志。

在下面的数据中,如果 Cntr=S 并且仅当下一行是 FE 后跟 BC/ABC 时,我想要一个 flag=1。我不希望 2/8/2019 观察 101 而没有 102 的数据,因为在 FE.

之后没有 BC/ABC

有:

   id   Date        Evt      Cntr
  101  2/2/2019      FE         
  101  2/3/2019      BC      S 
  101  2/4/2019      FE
  101  2/5/2019      BC
  101  2/6/2019      FE
  101  2/7/2019      ABC
  101  2/8/2019      FE
  102  2/2/2019      FE

想要:

   id   Date        Evt      Cntr       flag
  101  2/2/2019      FE         
  101  2/3/2019      BC      S 
  101  2/4/2019      FE                  1
  101  2/5/2019      BC                  1 
  101  2/6/2019      FE                  1
  101  2/7/2019      ABC                 1  
  101  2/8/2019      FE
  102  2/2/2019      FE 

我尝试使用 lagretain 函数来解决这个问题,但没有得到我想要的。请帮忙!!

这是另一种情况,其中 DOW 处理可以计算行的标记状态。

数组可用于跟踪组中的值。数组简化了 S 之后多个区域标记的计算。选择大于最大预期组大小的数组大小。

data have;
infile datalines missover;
attrib 
  id format=4. 
  date informat=mmddyy10. format=mmddyy10. 
  evt length= 
  cntr length=
;
input 
  id   Date        Evt      Cntr; datalines;
  101  2/2/2019      FE         
  101  2/3/2019      BC      S 
  101  2/4/2019      FE
  101  2/5/2019      BC
  101  2/6/2019      FE
  101  2/7/2019      ABC
  101  2/8/2019      FE
  102  2/2/2019      FE
  ;

data want;
  array evts[-1:1000]  _temporary_ ;
  array flags[1000]  _temporary_;

  call missing(of evts[*]);
  call missing(of flags[*]);

  do _n_ = 1 to dim(flags) until (last.id);

    set have;
    by id;

    evts[_n_] = evt;

    if cntr='S' then _s_index = _n_;

    if 0 < _s_index < _n_ - 1 then 
      if evt in ('BC', 'ABC') then 
        if evts[_n_-1] = 'FE' then 
          do ;
            flags[_n_] = '1';
            flags[_n_-1] = '1';
          end;
  end;

  if not last.id then do;
    put 'ERROR: ' id= 'group size larger than array size';
    stop;
  end;

  * apply flag value computed for each row of the group;
  do _n_ = 1 to _n_;
    set have;
    flag = flags[_n_];
    output;
  end;

  drop _:;
run;