如何识别数据集中的特定序列并对其进行标记?

时间:2019-04-03 04:25:33

标签: sas

如何识别每个组中“标记”列中的第一个“ 1,0”序列,并像在“标记2”列中一样标记一个“ 1”?

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 个答案:

答案 0 :(得分:1)

此问题需要使用类似于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;