Отбросьте наблюдения, когда условие выполнено несколькими переменными - PullRequest
1 голос
/ 17 февраля 2020

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

Если нет флага = 'Y', тогда я хочу, чтобы все наблюдения для этого идентификатора (например, id = 102) Я хочу отобразить, если следующая строка для этого идентификатора - Fee, за которой следует флаг 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/4/2019      REF1      Y             10
     103  2/5/2019      Fee              10

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

data want;
    set have;
    by id Date;
    drop count;

    if (first.id or first.date) and FLAG='Y' then
        do;
            retain count;
            count=1;
            output;
            return;
        end;

    if count=1 and ((first.id or first.date) and Flag ne 'Y') then
        do;
            retain count;
            delete;
            return;
        end;
    output;
run;

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

Спасибо

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Техника, известная как DOW l oop, может выполнить вычисление, которое каким-то образом измеряет группу, а затем, за секунду l oop, применить это вычисление к членам группы.

DOW полагается на оператор SET внутри l oop. В этом случае вычисление «какая строка в группе является последней с flag="Y".

data want;
  * DOW loop, contains computation;

  _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;

  * Follow up loop, applies computation;
  do _n_ = 1 to _n_;
    set have;
    if _n_ <= _max_n_with_Y then OUTPUT;
  end;
  drop _:;
run;
0 голосов
/ 17 февраля 2020

Вот один из способов

data have;
input id $ Date : mmddyy10. Evt_Type $ Flag $ Amt1 Amt2;
format Date mmddyy10.;
infile datalines dsd missover;
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,
102,2/2/2019,Fee,,25,
102,2/2/2019,REF1,N,25,
;

data want;
   do _N_ = 1 by 1 until (last.id);
      set have;
      by id;
      if flag = "Y" then _iorc_ = _N_;
   end;

   do _N_ = 1 to _N_;
      set have;
      if _N_ le _iorc_ then output;
   end;
   _iorc_=1e7;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...