这是我更新后的程序,你看看有什么问题。
data test;
input subjid date: yymmdd10. dose time;
format date yymmdd10.;
cards;
1 2006-9-30 25 1
2 2006-10-1 15 1
2 2006-10-1 18 2
2 2006-10-3 30 1
2 2006-10-4 30 1
3 2006-10-4 30 1
3 2006-10-5 10 1
3 2006-10-13 35 1
4 2006-10-7 30 1
4 2006-10-9 10 1
4 2006-10-12 30 1
4 2006-10-20 30 1
5 2006-10-10 30 1
5 2006-10-11 30 1
5 2006-10-12 10 1
5 2006-10-13 70 1
5 2006-10-14 25 1
5 2006-10-15 30 1
5 2006-10-16 30 1
5 2006-10-17 45 1
5 2006-10-18 30 1
5 2006-10-19 20 1
5 2006-10-20 35 1
5 2006-10-21 35 1
5 2006-10-22 35 1
5 2006-10-23 35 1
5 2006-11-2 35 1
;
* pick up the valid treatment phase;
proc sql;
create table test1 as
select * from test
group by subjid
having date < min(date)+13
order by subjid,date,time;
quit;
* combine the subjects who dose two times a day;
data test2;
set test1;
by subjid date time;
retain dose_;
if first.date then dose_=dose;
else dose+dose_;
if last.date;
run;
* compare the date and dose from this time to next time;
data test3;
set test2;
by subjid date time;
date1=lag(date);
dose1=lag(dose);
if first.subjid then do; date1=.; dose1=.; end;
if first.subjid and last.subjid then do; date1=date; dose1=dose; flag=1;end;
if date1 ne . and date-date1+1>7 then status=1;
if status=. then status=0;
if date-date1+1<=7 and date-date1>1 then miss=1;
else miss=0;
format date1 fdate yymmdd10.;
drop dose_;
run;
proc sql;
* status, missing dose;
create table status as
select distinct subjid, status
from test3
group by subjid
having status=max(status)
order by subjid;
create table miss as
select distinct subjid, miss
from test3
group by subjid
having miss=max(miss)
order by subjid;
* actual dose date;
create table actdate as
select subjid, count(distinct date) as actdate
from test3
where date-date1<=7
group by 1
order by 1;
* mean dose;
create table mean as
select distinct subjid, ifn(flag=1,dose,mean(dose)) as mean
from test3
where flag=1 or dose ne dose1
group by 1
order by 1;
* adjust time;
create table adjtime as
select distinct subjid,ifn(flag=1,0,count(distinct date1)) as adjtime
from test3
where flag=1 or (dose1 ne . and dose ne dose1)
group by 1
order by 1;
* adjust mean;
create table adjmean as
select a.subjid, ifn(n=0,0,(a.n/b.adjtime)) as adjmean from
(select distinct subjid, ifn(flag=1,0,sum(abs(dose-dose1))) as n
from test3
where flag=1 or (dose1 ne . and dose ne dose1)
group by 1) a
join adjtime b
on a.subjid=b.subjid
order by a.subjid;
quit;
* final dateset;
data final;
merge actdate status miss adjtime mean adjmean;
by subjid;
run;
|