在'之前删除观察结果;开始';在'之后;结束';-SAS代码

在'之前删除观察结果;开始';在'之后;结束';-SAS代码,sas,Sas,我的表中有一些我正试图删除的前导和尾随观察结果。我想删除每个组的每个“开始”事件之前和每个“结束”事件之后的行。下表类似: | Time | Group | Event | Value | | 1 | 1 | NA | 0 | | 2 | 1 | NA | 0 | | 3 | 1 | Begin | 1.1 | | 4 | 1 | NA | 1.2 | | 5 | 1 |

我的表中有一些我正试图删除的前导和尾随观察结果。我想删除每个组的每个“开始”事件之前和每个“结束”事件之后的行。下表类似:

| Time | Group | Event | Value  |

|   1  |    1  | NA    |      0 |
|   2  |    1  | NA    |      0 |
|   3  |    1  | Begin |    1.1 |
|   4  |    1  | NA    |    1.2 |
|   5  |    1  | NA    |    1.3 |
|   6  |    1  | End   |    1.4 |
|   7  |    1  | NA    |      0 |
|   1  |    2  | NA    |      0 |
|   2  |    2  | Begin |    1.1 |
|   3  |     2 | NA    |    1.2 |
|   4  |     2 | End   |    1.3 |
|   5  |     2 | NA    |    1.4 |
一种方法是

data have;
input  Time  Group  Event $ Value  ;
datalines;
1      1   NA          0 
2      1   NA          0 
3      1   Begin     1.1 
4      1   NA        1.2 
5      1   NA        1.3 
6      1   End       1.4 
7      1   NA          0 
1      2   NA          0 
2      2   Begin     1.1 
3       2  NA        1.2 
4       2  End       1.3 
5       2  NA        1.4 
;


 data have2(keep= Group min_var max_var);
    set have;
   by group;
   retain min_var max_var;
     if trim(Event)= "Begin" then min_var =_n_ ;
       if trim(Event)= "End" then max_var =_n_;
      if last.group;
       run;

       data want;
          merge have have2;
       by group;
       if _n_  ge min_var and _n_  le max_var ;
         drop min_var max_var;
        run;

我得出了一个简单的方法,但会受到实际数据大小的限制

data have;
input  Time  Group  Event $ Value  ;
datalines;
1      1   NA          0 
2      1   NA          0 
3      1   Begin     1.1 
4      1   NA        1.2 
5      1   NA        1.3 
6      1   End       1.4 
7      1   NA          0 
1      2   NA          0 
2      2   Begin     1.1 
3       2  NA        1.2 
4       2  End       1.3 
5       2  NA        1.4 
;
run;

proc sort data = have;
     by group time;
run;

data have1;
     set have;
     count + 1;
     by group;
     if first.group then count = -100;
     if event = 'Begin' then count = 0;
     if event = 'End' then count = 100;
     if count < 0 or count >100 then delete;
run;
数据已经存在;
输入时间组事件$Value;
数据线;
11NA 0
2 1 NA 0
3 1开始1.1
4.1 NA 1.2
5.1 NA 1.3
6 1完1.4
7 1 NA 0
1 2 NA 0
2开始1.1
3.2 NA 1.2
4.2结束1.3
5.2 NA 1.4
;
跑
proc sort data=have;
分组时间;
跑
数据表1;
集有;
计数+1;
分组;
如果第一组,则计数=-100;
如果事件=开始,则计数=0;
如果事件=结束,则计数=100;
如果计数<0或计数>100,则删除;
跑

如果在“开始”和“结束”之间的观测值少于100个,并且在“开始”之前的观测值少于100个,则当前代码可以应用于小尺寸数据。您可以根据真实数据大小调整初始计数值

假设传入数据已经排序,并且每个组中有零个或多个连续有界的开始到结束范围:

data want;
  do until (last.group);
    set have;
    by group time;
    if event = 'Begin' then _keeprow = 1;
    if _keeprow then output;
    if event = 'End' then _keeprow = 0;
  end;
  drop _keeprow;
end;