Как распознать определенную последовательность в наборе данных и отметить ее? - PullRequest
0 голосов
/ 03 апреля 2019

Как распознать первую последовательность «1,0» в столбце «Флаг» из каждой группы и отметить «1» точно так же, как в столбце «Флаг2»?

ID  Flag    Flag2
1   1   
1   1   1
1   0   
1   1   
1   0   
1   0   
2   1   
2   1   
2   1   
2   1   1
2   0   
2   0   
3   0   
3   0   
3   0   
3   0   
4   1   
4   1   1
4   0   
4   1

1 Ответ

1 голос
/ 03 апреля 2019

Проблема требует использования концепции «опережения» (значение из следующей строки), аналогичной концепции запаздывания, предоставляемой функцией 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;
...