如何根据 SAS 中先前行的条件添加标志
How to add a flag based on a condition on previous rows in SAS
我有以下数据,如果在前一行中满足条件,我想在每一行中添加一个标志。
在下面的数据中,如果 Cntr=S 并且仅当下一行是 FE 后跟 BC/ABC 时,我想要一个 flag=1。我不希望 2/8/2019 观察 101 而没有 102 的数据,因为在 FE.
之后没有 BC/ABC
有:
id Date Evt Cntr
101 2/2/2019 FE
101 2/3/2019 BC S
101 2/4/2019 FE
101 2/5/2019 BC
101 2/6/2019 FE
101 2/7/2019 ABC
101 2/8/2019 FE
102 2/2/2019 FE
想要:
id Date Evt Cntr flag
101 2/2/2019 FE
101 2/3/2019 BC S
101 2/4/2019 FE 1
101 2/5/2019 BC 1
101 2/6/2019 FE 1
101 2/7/2019 ABC 1
101 2/8/2019 FE
102 2/2/2019 FE
我尝试使用 lag
和 retain
函数来解决这个问题,但没有得到我想要的。请帮忙!!
这是另一种情况,其中 DOW 处理可以计算行的标记状态。
数组可用于跟踪组中的值。数组简化了 S
之后多个区域标记的计算。选择大于最大预期组大小的数组大小。
data have;
infile datalines missover;
attrib
id format=4.
date informat=mmddyy10. format=mmddyy10.
evt length=
cntr length=
;
input
id Date Evt Cntr; datalines;
101 2/2/2019 FE
101 2/3/2019 BC S
101 2/4/2019 FE
101 2/5/2019 BC
101 2/6/2019 FE
101 2/7/2019 ABC
101 2/8/2019 FE
102 2/2/2019 FE
;
data want;
array evts[-1:1000] _temporary_ ;
array flags[1000] _temporary_;
call missing(of evts[*]);
call missing(of flags[*]);
do _n_ = 1 to dim(flags) until (last.id);
set have;
by id;
evts[_n_] = evt;
if cntr='S' then _s_index = _n_;
if 0 < _s_index < _n_ - 1 then
if evt in ('BC', 'ABC') then
if evts[_n_-1] = 'FE' then
do ;
flags[_n_] = '1';
flags[_n_-1] = '1';
end;
end;
if not last.id then do;
put 'ERROR: ' id= 'group size larger than array size';
stop;
end;
* apply flag value computed for each row of the group;
do _n_ = 1 to _n_;
set have;
flag = flags[_n_];
output;
end;
drop _:;
run;
我有以下数据,如果在前一行中满足条件,我想在每一行中添加一个标志。
在下面的数据中,如果 Cntr=S 并且仅当下一行是 FE 后跟 BC/ABC 时,我想要一个 flag=1。我不希望 2/8/2019 观察 101 而没有 102 的数据,因为在 FE.
之后没有 BC/ABC有:
id Date Evt Cntr
101 2/2/2019 FE
101 2/3/2019 BC S
101 2/4/2019 FE
101 2/5/2019 BC
101 2/6/2019 FE
101 2/7/2019 ABC
101 2/8/2019 FE
102 2/2/2019 FE
想要:
id Date Evt Cntr flag
101 2/2/2019 FE
101 2/3/2019 BC S
101 2/4/2019 FE 1
101 2/5/2019 BC 1
101 2/6/2019 FE 1
101 2/7/2019 ABC 1
101 2/8/2019 FE
102 2/2/2019 FE
我尝试使用 lag
和 retain
函数来解决这个问题,但没有得到我想要的。请帮忙!!
这是另一种情况,其中 DOW 处理可以计算行的标记状态。
数组可用于跟踪组中的值。数组简化了 S
之后多个区域标记的计算。选择大于最大预期组大小的数组大小。
data have;
infile datalines missover;
attrib
id format=4.
date informat=mmddyy10. format=mmddyy10.
evt length=
cntr length=
;
input
id Date Evt Cntr; datalines;
101 2/2/2019 FE
101 2/3/2019 BC S
101 2/4/2019 FE
101 2/5/2019 BC
101 2/6/2019 FE
101 2/7/2019 ABC
101 2/8/2019 FE
102 2/2/2019 FE
;
data want;
array evts[-1:1000] _temporary_ ;
array flags[1000] _temporary_;
call missing(of evts[*]);
call missing(of flags[*]);
do _n_ = 1 to dim(flags) until (last.id);
set have;
by id;
evts[_n_] = evt;
if cntr='S' then _s_index = _n_;
if 0 < _s_index < _n_ - 1 then
if evt in ('BC', 'ABC') then
if evts[_n_-1] = 'FE' then
do ;
flags[_n_] = '1';
flags[_n_-1] = '1';
end;
end;
if not last.id then do;
put 'ERROR: ' id= 'group size larger than array size';
stop;
end;
* apply flag value computed for each row of the group;
do _n_ = 1 to _n_;
set have;
flag = flags[_n_];
output;
end;
drop _:;
run;