全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1125 3
2021-04-02
求教大神,假如有这样一组数据:
ID    SIG
1      正常
1      正常
1      异常有临床意义
1      异常有临床意义
1      异常无临床意义
1      正常
1      正常
2      正常
2      正常
2     异常有临床意义
2     正常
2     正常
2     正常

2     异常有临床意义
2     正常

对于每个ID,只想保留SIG第一次出现异常有临床意义到到不再出现异常有临床意义的最后一次正常,比如对于ID为1的数据来说,要保留3~6行,对于ID为2的数据来说要保留3~8行,如何编程
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2021-4-2 22:26:05
没想到什么好办法,写着写着就变的复杂了。

data have;
input ID    SIG $20.;
cards;
1      正常
1      正常
1      异常有临床意义
1      异常有临床意义
1      异常无临床意义
1      正常
1      正常
2      正常
2      正常
2     异常有临床意义
2     正常
2     正常
2     正常
2     异常有临床意义
2     正常
;run;
data want_1;
        set have;
        by id;
        if first.id then do;
                rows=0;
                flg=0;
        end;
        rows+1;
        if sig='异常有临床意义' then flg+1;
        if flg>0;

run;

proc sql ;
        create table work.want_2 as select t1.id,min(t1.rows) as normal_min_rows
                from work.want_1 t1
                        ,(select id,max(rows) as max_rows
                                from work.want_1
                                where sig='异常有临床意义'
                                group by id) t2
        where t1.id=t2.id
        and t1.rows>t2.max_rows
        and t1.sig='正常'
        group by t1.id;
quit;

data want;
        merge work.want_1 work.want_2;
        by id;
        if rows<=normal_min_rows;
        keep id sig;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-4-4 12:54:51
要方便的进行倒序查找,建议使用多重set或hash技巧:
data have;
input ID    SIG $20.;
cards;
1      正常
1      正常
1      异常有临床意义
1      异常有临床意义
1      异常无临床意义
1      正常
1      正常
2      正常
2      正常
2     异常有临床意义
2     正常
2     正常
2     正常
2     异常有临床意义
2     正常
3      正常
3     异常有临床意义
3     异常有临床意义
3      正常
3     异常无临床意义
;run;

data want(drop=tmp:);
  set have;
  by id notsorted;

  retain csfn;    *此前存在cs记录的标识;
  if first.id then csfn = .;
  if sig = '异常有临床意义' then csfn = 1;

  do i = rec to 1 by -1;    *此前cs记录已经转变为正常的标识;
    set have(rename=(id=tmpid sig=tmpsig)) nobs=rec point=i;
    if id=tmpid and tmpsig = '异常有临床意义' then leave;
    else if id=tmpid and tmpsig = '正常' and _N_>i then csfn = .;
  end;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2021-4-6 13:49:04
复制代码

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群