繁体   English   中英

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

[英]SAS - Drop observations once a condition is met, by ID

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

这是一种方法:

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;

使用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语句之前的do只是为了使列保持原始顺序。

我将使用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;

OUTPUT:

                                ID    TIME    DUMMY

                                 1      1       0
                                 1      2       0
                                 1      3       1
                                 2      3       1
                                 3      1       1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM