Hello, I am hoping someone can help me simplify my code. In short, I am trying to summarize costs per patient per event type, depending on when the event happened (specifically, within 90 days after randomization, within 1 year, within 2 years etc... The sums should therefore be cumulative.) Each event has a cost and also a corresponding variable specifying how many days after time 0 (randomization) the event occured. My dataset looks something like this (simplified): ID dis_c_hf_hosp1 dis_c_hf_hosp2 dis_c_hf_hosp3 days_rand2hf_hosp1 days_rand2hf_hosp2 days_rand2hf_hosp3 1 8000 7500 7000 60 180 730 2 8500 8000 7000 30 180 730 3 8000 7500 7000 60 180 730 4 9000 8500 7000 10 180 730 5 8000 7500 7000 60 180 730 I am repeating this step for many different clinical events and would therefore like a short, generalizable code. Currently, I am working in a very long macro that goes up to max 11 events per patient (max observed in dataset). It works, but there seems there should be an easier way to do this! %macro time_costs (event, min, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11);
data time_costs_&event; set all_costs;
/*costs within 90 days, excl. randomized implantation costs*/
c90_&event=0;
if days_rand2&event&min ne . and days_rand2&event&min <= 90 then do c90_&event=dis_c_&event&min; end;
if days_rand2&event&_2 ne . and days_rand2&event&_2 <= 90 then do c90_&event=sum(dis_c_&event&min,dis_c_&event&_2); end;
if days_rand2&event&_3 ne . and days_rand2&event&_3 <= 90 then do c90_&event=sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3); end;
if days_rand2&event&_4 ne . and days_rand2&event&_4 <= 90 then do c90_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4); end;
if days_rand2&event&_5 ne . and days_rand2&event&_5 <= 90 then do c90_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5); end;
if days_rand2&event&_6 ne . and days_rand2&event&_6 <= 90 then do c90_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6); end;
if days_rand2&event&_7 ne . and days_rand2&event&_7 <= 90 then do c90_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7 ); end;
if days_rand2&event&_8 ne . and days_rand2&event&_8 <= 90 then do c90_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8); end;
if days_rand2&event&_9 ne . and days_rand2&event&_9 <= 90 then do c90_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8,dis_c_&event&_9 ); end;
if days_rand2&event&_10 ne . and days_rand2&event&_10 <= 90 then do c90_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8,dis_c_&event&_9, dis_c_&event&_10 ); end;
if days_rand2&event&_11 ne . and days_rand2&event&_11 <= 90 then do c90_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8,dis_c_&event&_9, dis_c_&event&_10, dis_c_&event&_11); end;
/*costs within 1 year, excl. randomized implantation costs (also includes the first 90 days!!)*/
c365_&event=0;
if days_rand2&event&min ne . and days_rand2&event&min <= 365 then do c365_&event=dis_c_&event&min; end;
if days_rand2&event&_2 ne . and days_rand2&event&_2 <= 365 then do c365_&event=sum(dis_c_&event&min,dis_c_&event&_2); end;
if days_rand2&event&_3 ne . and days_rand2&event&_3 <= 365 then do c365_&event=sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3); end;
if days_rand2&event&_4 ne . and days_rand2&event&_4 <= 365 then do c365_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4); end;
if days_rand2&event&_5 ne . and days_rand2&event&_5 <= 365 then do c365_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5); end;
if days_rand2&event&_6 ne . and days_rand2&event&_6 <= 365 then do c365_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6); end;
if days_rand2&event&_7 ne . and days_rand2&event&_7 <= 365 then do c365_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7 ); end;
if days_rand2&event&_8 ne . and days_rand2&event&_8 <= 365 then do c365_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8); end;
if days_rand2&event&_9 ne . and days_rand2&event&_9 <= 365 then do c365_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8,dis_c_&event&_9 ); end;
if days_rand2&event&_10 ne . and days_rand2&event&_10 <= 365 then do c365_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8,dis_c_&event&_9, dis_c_&event&_10 ); end;
if days_rand2&event&_11 ne . and days_rand2&event&_11 <= 365 then do c365_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8,dis_c_&event&_9, dis_c_&event&_10, dis_c_&event&_11); end;
/*costs between year 1-2*/
c730_&event=0;
if days_rand2&event&min ne . and days_rand2&event&min <= 730 then do c730_&event=dis_c_&event&min; end;
if days_rand2&event&_2 ne . and days_rand2&event&_2 <= 730 then do c730_&event=sum(dis_c_&event&min,dis_c_&event&_2); end;
if days_rand2&event&_3 ne . and days_rand2&event&_3 <= 730 then do c730_&event=sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3); end;
if days_rand2&event&_4 ne . and days_rand2&event&_4 <= 730 then do c730_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4); end;
if days_rand2&event&_5 ne . and days_rand2&event&_5 <= 730 then do c730_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5); end;
if days_rand2&event&_6 ne . and days_rand2&event&_6 <= 730 then do c730_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6); end;
if days_rand2&event&_7 ne . and days_rand2&event&_7 <= 730 then do c730_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7 ); end;
if days_rand2&event&_8 ne . and days_rand2&event&_8 <= 730 then do c730_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8); end;
if days_rand2&event&_9 ne . and days_rand2&event&_9 <= 730 then do c730_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8,dis_c_&event&_9 ); end;
if days_rand2&event&_10 ne . and days_rand2&event&_10 <= 730 then do c730_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8,dis_c_&event&_9, dis_c_&event&_10 ); end;
if days_rand2&event&_11 ne . and days_rand2&event&_11 <= 730 then do c730_&event=
sum(dis_c_&event&min, dis_c_&event&_2, dis_c_&event&_3, dis_c_&event&_4, dis_c_&event&_5, dis_c_&event&_6,dis_c_&event&_7,
dis_c_&event&_8,dis_c_&event&_9, dis_c_&event&_10, dis_c_&event&_11); end;
/*costs between year 2-3*/
/*costs between year 3-4*/
/*costs between year 4-5*/
/*costs between year 5-6*/
/*formatting costs*/
format c90_&event c365_&event c730_&event 20.;
run;
%mend time_costs;
%time_costs (hf_hosp, 1,2, 3, 4, 5, 6, 7, 8, 9, 10, 11); Thank you! - SAS rookie Working in SAS 9.4.
... View more