对于每个ID,我想删除虚拟变量取值1后的所有观察结果。例如:
我的数据:
ID TIME DUMMY
1 1 0
1 2 0
1 3 1
1 4 0
2 1 0
2 2 0
2 3 1
3 1 1
3 2 0
3 3 0
我想要的输出:
ID TIME DUMMY
1 1 0
1 2 0
1 3 1
2 1 0
2 2 0
2 3 1
3 1 1
答案 0 :(得分:2)
这是一种方法:
data want(drop = a);
set have;
by id;
retain a;
if first.id then a = 1;
if a = 1 then output;
if dummy = 1 then a = 0;
run;
答案 1 :(得分:1)
使用dow-loop看起来比保留和滞后更优雅。 在此处阅读有关此编程结构的更多信息:http://analytics.ncsu.edu/sesug/2011/SS01.Dorfman.pdf 这非常有用。
data want(drop=printit);
if 0 then set have;
printit = last.id;
do until(last.id or dummy);
set have;
by id;
if printit then output;
end;
run;
do
语句之前的行只是为了保持列的原始顺序。
答案 2 :(得分:0)
我将使用OUTPUT
,RETAIN
和RETURN
语句的帮助来覆盖DATA
步骤循环。 RETURN
语句强制DATA
步骤立即进入下一次迭代。这应该删除DUMMY = 1观察之间的所有观察结果:
data want;
set test;
drop count;
if DUMMY = 1 then do;
retain count;
count = 1;
output;
return;
end;
if count = 1 and DUMMY ne 1 then do;
retain count;
delete;
return;
end;
output;
run;
输出:
ID TIME DUMMY
1 1 0
1 2 0
1 3 1
2 3 1
3 1 1