SAS - 符合条件后,通过ID删除观察结果

时间:2013-12-14 22:14:46

标签: sas

对于每个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

3 个答案:

答案 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)

我将使用OUTPUTRETAINRETURN语句的帮助来覆盖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