Sas 如何识别数据集中的特定序列并对其进行标记?
如何从每组中识别“Flag”列中的第一个“1,0”序列,并像在“Flag2”列中一样标记“1”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
该问题需要使用类似于
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;