楼主: serenaakh
2286 13

求教:关于SAS中删除的问题~ [推广有奖]

11
chendonghui1987 发表于 2012-4-22 15:59:29
2345       1990         2
2345       1991         1
2345       1992         0
2345       1993         0
2345       1994         2
2345       1995         1
3456       1989         0
3456       1990         0
3456       1991         1
3456       1992         1
3456       1993         1
3456       1994         2
3456       1995         2
4567       1992         0
4567       1993         1
4567       1994         2
4567       1995         0
5678       1991         1
5678       1992         0
5678       1993         2
5678       1994         2
5678       1995         1
这是我根据code,year,group进行了排序,你的最后结果是只留下code为3456的数据,会不会有group为3的数据,要不要留下呢,例如000111122223333

12
serenaakh 发表于 2012-4-22 16:07:18
chendonghui1987 发表于 2012-4-22 15:59
2345       1990         2
2345       1991         1
2345       1992         0
应该不会有group为3的数据~
因为我只分了3组~
就是0一组,1一组,2一组~
你生活在一个可以没有我的世界,我居住在一个只有你的天空...

13
chendonghui1987 发表于 2012-4-22 16:52:35
不知道数据量大的时候是不是你要的结果,你看看对不对,不对的话我在改,希望对你有帮助.

data work.a;
        input code $ year $ group;
        datalines;
2345       1990         2
2345       1991         1
2345       1992         0
2345       1993         0
2345       1994         2
2345       1995         1
3456       1989         0
3456       1990         0
3456       1991         1
3456       1992         1
3456       1993         1
3456       1994         2
3456       1995         2
4567       1992         0
4567       1993         1
4567       1994         2
4567       1995         0
5678       1991         1
5678       1992         0
5678       1993         2
5678       1994         2
5678       1995         1
;
run;

proc sort data = work.a;
        by code year group;
run;


data work.b;
        length flag $10.;
        set work.a;
        by code year group;
        if first.code then do;
                if group = 0 then do;
                        flag = 'save';
                        i = group;
                       
                end;else do;
                        flag = 'delete';
                end;

                retain flag i;
               
        end;else if flag = 'save' then do;
                if group = i or group = i+1 then do;
                        i = group;
                        flag = 'save';
                end;else do;
                        flag = 'delete';
                end;

                retain flag i;
        end;
run;



proc sql noprint;
        create table work.d as
                select code,
                        year,
                        group
                from work.b
                where code not in (select distinct code
                        from work.b
                        where flag = 'delete');
quit;

14
greatvia 发表于 2012-4-23 16:21:57
根据我的理解,写了下面的code,楼主看看是不是想要的。
就是看对每个code,挑出group值是升序排列的
data work.a;
        input code $ year $ group;
        datalines;
2345       1990         2
2345       1991         1
2345       1992         0
2345       1993         0
2345       1994         2
2345       1995         1
3456       1989         0
3456       1990         0
3456       1991         1
3456       1992         1
3456       1993         1
3456       1994         2
3456       1995         2
4567       1992         0
4567       1993         1
4567       1994         2
4567       1995         0
5678       1991         1
5678       1992         0
5678       1993         2
5678       1994         2
5678       1995         1
;
run;


data b(keep=code);
        set a;
        by code;
        retain order;
        t= lag1(group);
        if first.code then order = 1;       
        else if last.code then do;
                if order =1 then output;
        end;
        else do;
                if order = 1 and (group < t) then order =0 ;
        end;
run;

proc sql;
        create table c as
        select a.*
        from a, b
        where a.code  = b.code
        ;
quit;

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 05:12