Удаление наблюдений до «начала» и после «окончания» - код SAS

Это несколько , связанное с этим вопросом .

Вы также можете просто использовать функцию by () :

x2 <- by(x$Frequency, x$Category, sum)
do.call(rbind,as.list(x2))

Эти другие пакеты (plyr, reshape) имеют преимущество в возврате данных .frame, но это стоит знать с помощью (), поскольку это базовая функция.

-1
задан Kiran 15 January 2019 в 23:01
поделиться

3 ответа

Предполагая, что входящие данные уже отсортированы и что в каждой группе есть ноль или более последовательно ограниченных диапазонов от начала до конца:

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;
0
ответ дан Richard 15 January 2019 в 23:01
поделиться

Один из способов сделать это

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;
0
ответ дан Kiran 15 January 2019 в 23:01
поделиться

Я вышел простым способом, но буду ограничен фактическим размером данных.

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;

Текущий код можно применить к данным небольшого размера, если у вас меньше 100 наблюдений между «Началом» и «Концом» и менее 100 наблюдений до «Начала». Вы можете настроить начальное значение счета в соответствии с истинным размером данных.

0
ответ дан Tao Xiang 15 January 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: