Проблема требует использования концепции «опережения» (значение из следующей строки), аналогичной концепции запаздывания, предоставляемой функцией lag
.Нет встроенной функции отведения, поэтому вам нужно проявить творческий подход.
- Объединить данные с самим собой без оператора
by
, где вторая версия: - Смещение поодна строка с параметром набора данных
firstobs
- Переименовывает переменные, чтобы можно было установить ведущее состояние с помощью
if
- Сохраненная переменная отслеживает, если 1, Внутри группы наблюдается 0 переходов.
Пример кода:
data have;input
ID Flag; datalines;
1 1
1 1
1 0
1 1
1 0
1 0
2 1
2 1
2 1
2 1
2 0
2 0
3 0
3 0
3 0
3 0
4 1
4 1
4 0
4 1
run;
data want;
merge
have
have(firstobs=2 rename=(id=lead_id flag=lead_flag))
;
retain flagged_id;
if (id=lead_id) /* lead is in same group */
and (flag=1) and (lead_flag=0) /* transition identified */
and (flagged_id ne id) then /* first such transition for group */
do;
flag2=1; /* flag the lead transition */
flagged_id = id; /* track id where transition last flagged */
end;
drop lead_: flagged:;
run;