Последняя измененная строка +1 в группе

У меня есть групповые данные и флаги, которые создаются каждый раз, когда имя изменяется в этой группе. Я могу вытащить последние два или первые два наблюдения в группе, но я изо всех сил пытаюсь понять, как вытащить последнее наблюдение с изменением имени И строкой сразу после.

Приведенный ниже код дает мне первые или последние два наблюдения для каждой группы, в зависимости от того, как я сортирую данные.

DATA LastTwo;
    SET WhatIveGot;
    count + 1;
    BY group_ID /*data pre sorted*/;
    IF FIRST.group_ID THEN count=1;
    IF count<=2 THEN OUTPUT;
RUN;

Мне нужно быть ПОСЛЕДНИМ наблюдением с изменением имени и следующей строкой.

 group_ID    NAME    DATE         NAME_CHange
     1       TOM     1/1/19            0
     1       Jill    1/30/19           1
     1       Jill    1/20/19           0
     1       Bob     2/10/19           1
     1       Bob     2/30/19           0
     2       TOM     2/1/19            0
     2       Jill    2/30/19           1
     2       Jill    2/20/19           0
     2       Jim     3/10/19           1
     2       Jim     3/30/19           0
     2       Jim     4/15/19           0
     3       Joe     2/20/19           0
     3       Kim     3/10/19           1
     3       Kim     3/30/19           0
     3       Ken     4/15/19           1
     4       Tim     3/10/19           0
     4       Tim     3/30/19           0

Желаемый результат:

 group_ID    NAME    DATE         NAME_CHange
     1       Bob     2/10/19           1
     1       Bob     2/30/19           0
     2       Jim     3/10/19           1
     2       Jim     3/30/19           0
     3       Ken     4/15/19           1

Случаи для Group_ID 2 и 3 являются препятствием. Данные уже отсортированы по дате.

Спасибо за любую помощь заранее


person user2448666    schedule 27.10.2020    source источник


Ответы (1)


Используйте обработку DOW, чтобы определить, где было последнее изменение имени. Применяйте эту информацию в следующем цикле.

Пример:

data want;
  do _n_ = 1 by 1 until (last.id);
    set have;
    by id name notsorted;
    if first.name then _index_of_last_name_change = _n_;
  end;

  do _n_ = 1 to _n_;
    set have;
    if _index_of_last_name_change <= _n_ <= _index_of_last_name_change+1 then OUTPUT;
  end;
  drop _:;
run;
person Richard    schedule 27.10.2020