Отбрасывание наблюдений после выполнения определенного условия в SAS - PullRequest
0 голосов
/ 21 февраля 2020

Это расширение предыдущего вопроса. ( Отбросить наблюдения, когда условие выполнено несколькими переменными ).

У меня есть следующие данные, и я использовал один из существующих ответов на вопросы, чтобы решить мою проблему с данными, но не смог получить то, что я хочу. Вот что у меня в моих данных Я не хочу отображать какие-либо наблюдения после последнего флага = 'Y'

Если нет флага = 'Y', тогда я хочу, чтобы все наблюдения для этого идентификатора (например, id = 102) Я хочу отобразить, если следующей строкой для этого идентификатора является Комиссия, за которой следует флаг REF1 / REF2 после flag = 'Y' (например, id = 101). Однако я не хочу, если нет REF1 / REF2 (egid = 103)

Имею:

   id   Date        Evt_Type   Flag   Amt1   Amt2
  101  2/2/2019      Fee              5
  101  2/3/2019      REF1      Y             5
  101  2/4/2019      Fee              10
  101  2/6/2019      REF2      Y             10
  101  2/7/2019      Fee               4
  101  2/8/2019      REF1
  102  2/2/2019      Fee              25
  102  2/2/2019      REF1      N      25
  103  2/3/2019      Fee              10
  103  2/4/2019      REF1      Y             10
  103  2/5/2019      Fee              10

Хочу:

  id   Date        Evt_Type   Flag   Amt1   Amt2
 101  2/2/2019      Fee              5
 101  2/3/2019      REF1      Y             5
 101  2/4/2019      Fee              10
 101  2/6/2019      REF2      Y             10
 101  2/7/2019      Fee               4
 101  2/8/2019      REF1
 102  2/2/2019      Fee              25
 102  2/2/2019      REF1      N      25
 103  2/3/2019      Fee              10
 103  2/4/2019      REF1      Y             10

Я пробовал следующее

data want;
  _max_n_with_Y = 1e12;

  do _n_ = 1 by 1 until (last.id);
    set have;
    by id;
  if flag='Y' then _max_n_with_Y = _n_;
 end;

  do _n_ = 1 to _n_;
   set have;
   if _n_ <= _max_n_with_Y then OUTPUT;
  end;
 drop _:;
run;

Любой Помощь приветствуется.

Спасибо

1 Ответ

0 голосов
/ 21 февраля 2020

Важным «ориентиром» является строка с flag='Y'

Дополнительные критерии для вывода строк post-landmark усложняют кодирование конечного автомата для отслеживания (или вычислить) номер строки (_n_) для последнего вывода группы.

Состояние row='Y' легко известно. Безусловное использование LAG может использоваться для проверки состояния после Y. Операторы SAS IF не имеют оценки короткого замыкания, поэтому, если LAG не входит в подчиненное предложение THEN, для этой задачи будут подходить стеки LAG.

Пример:

data have;
attrib
  id format=4.
  date informat=mmddyy10. format=mmddyy10.
  evt_type length=$4
  flag length=$1
  amt1 amt2 format=4.
;
input
   id   Date        Evt_Type   Flag   Amt1   Amt2; datalines;
  101  2/2/2019      Fee       .      5      .
  101  2/3/2019      REF1      Y      .      5
  101  2/4/2019      Fee       .      10     .
  101  2/6/2019      REF2      Y      .      10
  101  2/7/2019      Fee       .       4     .
  101  2/8/2019      REF1      .      .      .
  102  2/2/2019      Fee       .      25     .
  102  2/2/2019      REF1      N      25     .
  103  2/3/2019      Fee       .      10     .
  103  2/4/2019      REF1      Y      .      10
  103  2/5/2019      Fee       .      10     .
;

data want;
  _y_n = 1e12;

  do _n_ = 1 by 1 until (last.id);
    set have;
    by id;

    if flag='Y' then _y_n = _n_;

    /* rule: post Y output of two rows should only occur once, and at the rows
     * immediately succeeding the Y row
     */
    if _n_ = _y_n + 2            /* is this row 2 after a Y */
      and lag(evt_type) = 'Fee'  /* is first row after Y Fee */
      and evt_type =: 'REF'      /* is second row after Y REF# */
    then 
      _upto_n = _n_;
  end;

  _upto_n = max (_upto_n, _y_n);

  do _n_ = 1 to _n_;
   set have;
   if _n_ <= _upto_n then OUTPUT;
  end;

  drop _:;
run;

Примечание относительно:

if _n_ = _y_n + 2            /* is this row 2 after a Y */
  and lag(evt_type) = 'Fee'  /* is first row after Y Fee */
  and evt_type =: 'REF'      /* is second row after Y REF# */
then 
  _upto_n = _n_;

Для строки 2 после Y,

  LAG2(<var>) is the <var> value from the Y row
  LAG (<var>) is the <var> value from the Y row+1
       <var>  is the <var> value from the Y row+2, which is the current row
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...