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

Sas 如何识别数据集中的特定序列并对其进行标记?,sas,Sas,如何从每组中识别“Flag”列中的第一个“1,0”序列,并像在“Flag2”列中一样标记“1” 该问题需要使用类似于lag函数提供的滞后概念的“超前”概念(下一行的值)。没有内置的领导功能,所以你需要有创造性 将数据合并到自身,不使用by语句,其中第二个版本为: 通过firstobs数据集选项偏移一行 重命名变量,以便使用if 如果在组内观察到1,0转换,则保留变量跟踪 示例代码: data have;input ID Flag; datalines; 1 1 1 1 1

如何从每组中识别“Flag”列中的第一个“1,0”序列,并像在“Flag2”列中一样标记“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;

另一种方法可能是1)颠倒顺序,2)标记一个
0,1
3)重置原始顺序?当然,颠倒顺序需要一个rownum变量,您必须标记最后的0,1,这将很难取消标记先前标记的0,1
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;