在30天内,有多少病人服用了超过2种药物?

来源:互联网 发布:php格式的视频怎么办 编辑:程序博客网 时间:2024/04/29 10:32

声明:资料来源SAS中文论坛

问: 在30天内,有多少病人服用了超过2种药物?SAS数据中的变量有:病人ID, 用药日期以及对应的药名。
id date medicine
1 2010jan01 a
1 2010jan04 a
1 2010jan16 a
1 2010feb04 b
2 2010mar03 c
2 2010mar04 c
....
假设数据量很大,有30万行,敬请牛人指教如何用SAS实现,并且计算机用时越少越好。

sxlion的思路:

data raw;
input id date $10. drug $1.;
date=input(catt(substr(date,8,2), substr(date,5,3),substr(date,1,4)), date12.);
cards;
1 2010jan01 a
1 2010jan04 a
1 2010jan16 a
1 2010feb04 b
1 2010feb17 a
1 2010mar08 c
2 2010feb10 c
2 2010feb14 c
2 2010mar03 b
2 2010mar04 c
3 2010jan16 a
3 2010jan18 a
3 2010mar04 c
;
run;
proc sort  data=raw out=ex;
   by id  date drug;
run;
data ex;
   set ex;
   if id=lag(id) and   0 <= date-lag(date)< 30 and drug ne lag(drug);
run;
proc sql;
   select id as patient, 'Y' as indicator 'Patient who had more than 2 drugs in 30 day'
          from ex;
quit;   

注:这里用到lag函数,导出滞后一期的变量值。

Super K的思路(速度很快):

data raw1(keep=coun);
attrib id1 format=best8. date1 format=date. drug1 format=$1.;
retain id1;
retain date1;
retain drug1;
retain count;
input #1 id date $10. drug $1. ;
input #2 id2 date2 $10. drug2 $1. ;
date=input(catt(substr(date,8,2), substr(date,5,3),substr(date,1,4)), date12.);
date2=input(catt(substr(date2,8,2), substr(date2,5,3),substr(date2,1,4)), date12.);
if (id=id2 and drug^=drug2 and date2<date+30) then do;if count^=id then coun+1;count=id;end;
if id1^=. and (id1=id and drug1^=drug and date<date1+30) then do;if count^=id then coun+1;count=id;end;
id1=id2;
date1=date2;
drug1=drug2;
cards;
1 2010jan01 a
1 2010jan04 a
1 2010jan16 a
1 2010feb04 b
1 2010feb17 a
1 2010mar08 c
2 2010feb10 c
2 2010feb14 c
2 2010mar03 b
2 2010mar04 c
3 2010jan16 a
3 2010jan18 a
3 2010mar04 c
;
run;
注:完全用data步搞到,对函数用的“出神入化”:attrib,retain,input,catt,substr,求和

原创粉丝点击