如何识别每个组中“标记”列中的第一个“ 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
答案 0 :(得分:1)
此问题需要使用类似于lag
函数提供的滞后概念的“超前”概念(下一行的值)。没有内置的线索功能,因此您需要发挥创造力。
by
语句将数据合并到其自身,第二个版本是:
firstobs
数据集选项偏移一行if
示例代码:
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;