How about data test;
input id date$ drug_class$ 15-28 ondrug1yes lastfollowupdate$;
datalines;
1 1/10/13 A_lowdose 1 4/02/15
1 2/05/13 A_highdose 1 4/02/15
1 3/28/13 Discontinued A 0 4/02/15
2 2/06/08 B_lowdose 1 3/05/10
;
run;
data test_1;
set test;
select(drug_class);
when("A_lowdose") drug_class_num=1;
when("A_highdose") drug_class_num=2;
when("Discontinued A") drug_class_num=3;
when("B_lowdose") drug_class_num=4;
when("B_highdose") drug_class_num=5;
when("Discontinued B") drug_class_num=6;
end;
run;
data dummy;
attrib id length=8.;
attrib drug_class_num length=8.;
attrib drug_class length=$14.;
do id=1 to 2;
if id eq 1 then do;
drug_class_num=1; drug_class="A_lowdose"; output;
drug_class_num=2; drug_class="A_highdose"; output;
drug_class_num=3; drug_class="Discontinued A"; output;
drug_class_num=4; drug_class="B_lowdose"; output;
drug_class_num=5; drug_class="B_highdose"; output;
drug_class_num=6; drug_class="Discontinued B"; output;
end;
else if id eq 2 then do;
drug_class_num=1; drug_class="A_lowdose"; output;
drug_class_num=2; drug_class="A_highdose"; output;
drug_class_num=3; drug_class="Discontinued A"; output;
drug_class_num=4; drug_class="B_lowdose"; output;
drug_class_num=5; drug_class="B_highdose"; output;
drug_class_num=6; drug_class="Discontinued B"; output;
end;
end;
run;
data test_2;
merge dummy(in=a)
test_1(in=b)
;
by id drug_class_num drug_class;
if a;
date_num=input(date, mmddyy8.);
lastfollowupdate_num=input(lastfollowupdate, mmddyy8.);
run;
proc transpose data=test_2 prefix=ondrug out=test_3_1(drop=_name_);
var ondrug1yes;
by id;
id drug_class_num;
run;
/*
ONDRUG1: OnDrugFlag where DRUG_CLASS eq "A_lowdose"
ONDRUG2: OnDrugFlag where DRUG_CLASS eq "A_highdose"
ONDRUG2: OnDrugFlag where DRUG_CLASS eq "Discontinued A"
ONDRUG4: OnDrugFlag where DRUG_CLASS eq "B_lowdose"
ONDRUG5: OnDrugFlag where DRUG_CLASS eq "B_highdose"
ONDRUG6: OnDrugFlag where DRUG_CLASS eq "Discontinued B"
*/
proc transpose data=test_2 prefix=date out=test_3_2(drop=_name_);
var date_num;
by id;
id drug_class_num;
run;
/*
DATE1: Date where DRUG_CLASS eq "A_lowdose"
DATE2: Date where DRUG_CLASS eq "A_highdose"
DATE2: Date where DRUG_CLASS eq "Discontinued A"
DATE4: Date where DRUG_CLASS eq "B_lowdose"
DATE5: Date where DRUG_CLASS eq "B_highdose"
DATE6: Date where DRUG_CLASS eq "Discontinued B"
*/
proc transpose data=test_2 prefix=followup out=test_3_3(drop=_name_);
var lastfollowupdate_num;
by id;
id drug_class_num;
run;
/*
FOLLOWUP1: FollowupDate where DRUG_CLASS eq "A_lowdose"
FOLLOWUP2: FollowupDate where DRUG_CLASS eq "A_highdose"
FOLLOWUP2: FollowupDate where DRUG_CLASS eq "Discontinued A"
FOLLOWUP4: FollowupDate where DRUG_CLASS eq "B_lowdose"
FOLLOWUP5: FollowupDate where DRUG_CLASS eq "B_highdose"
FOLLOWUP6: FollowupDate where DRUG_CLASS eq "Discontinued B"
*/
data test_4;
length id 8. a_lowdose 8.
start_al end_al $200.
a_highdose 8.
start_ah end_ah $200.
b_lowdose 8.
start_bl end_bl $200.
b_highdose 8.
start_bh end_bh $200.
;
merge test_3_1(in=a)
test_3_2(in=b)
test_3_3(in=c)
;
by id;
if a;
%macro ondrug(in=, out=);
select(&in.);
when(1) &out.=1;
when(.) &out.=0;
end;
%mend ondrug;
%ondrug(in=ondrug1, out=A_lowdose)
%ondrug(in=ondrug2, out=A_highdose)
%ondrug(in=ondrug4, out=B_lowdose)
%ondrug(in=ondrug5, out=B_highdose)
%macro date(in1=, out1=, in2=, out2=);
select;
when(&in1. ne .) &out1.=put(&in1., mmddyy8.);
when(&in1. eq .) &out1.="";
end;
select;
when(&in2. ne .) &out2.=put(&in2.+1, mmddyy8.);
when(&in2. eq .) &out2.="";
end;
%mend date;
%date(in1=date1, out1=start_al, in2=date2, out2=start_ah)
%date(in1=date4, out1=start_bl, in2=date5, out2=start_bh)
%macro enddate(if1=, if2=, if3=, out1=, out2=, in1=, in2=, in3=, in4=);
if &if1. eq 1 and &if2. eq . and &if3. ne 0 then do;
&out1.=put(&in1., mmddyy8.);
&out2.="";
end;
else if &if1. eq 1 and &if2. eq . and &if3. eq 0 then do;
&out1.=put(&in2., mmddyy8.);
&out2.="";
end;
else if &if1. eq 1 and &if2. eq 1 and &if3. ne 0 then do;
&out1.=put(&in3., mmddyy8.);
&out2.=put(&in4., mmddyy8.);
end;
else if &if1. eq 1 and &if2. eq 1 and &if3. eq 0 then do;
&out1.=put(&in3., mmddyy8.);
&out2.=put(&in2., mmddyy8.);
end;
%mend enddate;
%enddate(if1=ondrug1, if2=ondrug2, if3=ondrug3, out1=end_al, out2=end_ah ,in1=followup1, in2=date3, in3=date2, in4=followup2)
%enddate(if1=ondrug4, if2=ondrug5, if3=ondrug6, out1=end_bl, out2=end_bh ,in1=followup4, in2=date6, in3=date5, in4=followup5)
run;
... View more