I'm working with medical administrative data, and I'm trying to flag patients who have had certain diagnoses or medical procedures. I've tried searching online and I've come across variations of do-loops or arrays, but I haven't been able to figure out how to apply them to my specific data. So far I've been using a data step and listing each variable. This works, but obviously it's unwieldy and not a good long-term solution. I've only shown 2 lists here, but the final version will have about 20. Also note that some of the codes are stems, so that O03 includes O031, O032, O035, etc. That's why I used "in:".
%let EPL_list = ("O021","O03");
%let excl_list_pm70154d = ("59820","59812","59821","0UDB");
DATA temp.Index_cases; SET comb.med_comm_2018_2021;
IF PRINCIPAL_DIAGNOSIS_CODE in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_1 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_2 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_3 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_4 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_5 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_6 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_7 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_8 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_9 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_10 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_11 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_12 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_13 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_14 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_15 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_16 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_17 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_18 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_19 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_20 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_21 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_22 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_23 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_24 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_25 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_26 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_27 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_28 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_29 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_30 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_31 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_32 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_33 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_34 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_35 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE IF DIAGNOSIS_CODE_36 in: (&EPL_list.) THEN EPL_flag = 1;
ELSE EPL_flag = 0;
IF PROCEDURE_CODE in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_1 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_2 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_3 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_4 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_5 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_6 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_7 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_8 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_9 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_10 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_11 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_12 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_13 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_14 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_15 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_16 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_17 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_18 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_19 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_20 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_21 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_22 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_23 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_24 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE IF ICD_PROCEDURE_CODE_25 in: (&excl_list_pm70154d.) THEN excl_list_pm70154d = 1;
ELSE excl_list_pm70154d = 0;
RUN;
Use arrays.
%let EPL_list = ("O021","O03");
%let excl_list_pm70154d = ("59820","59812","59821","0UDB");
data temp.Index_cases;
set comb.med_comm_2018_2021;
array dx PRINCIPAL_DIAGNOSIS_CODE DIAGNOSIS_CODE_1-DIAGNOSIS_CODE_36;
do index=1 to dim(dx) until(EPL_flag);
EPL_flag= dx[index] in: &epl_list. ;
end;
array px PROCEDURE_CODE ICD_PROCEDURE_CODE_1-ICD_PROCEDURE_CODE_25;
do index=1 to dim(px) until(excl_list_pm70154d);
excl_list_pm70154d = px[index] in: &excl_list_pm70154d.;
end;
run;
Here's how it could look using arrays:
array pcodes {37} PRINCIPAL_DIAGNOSIS_CODE diagnosis_code_1 - diagnosis_code_36;
EPL_flag = 0;
do _n_=1 to 37 until (EPL_flag = 1);
if pcodes{_n_} in: (&EPL_list.) THEN EPL_flag = 1;
end;
That replaces just one of the groupings of statements.
Use arrays.
%let EPL_list = ("O021","O03");
%let excl_list_pm70154d = ("59820","59812","59821","0UDB");
data temp.Index_cases;
set comb.med_comm_2018_2021;
array dx PRINCIPAL_DIAGNOSIS_CODE DIAGNOSIS_CODE_1-DIAGNOSIS_CODE_36;
do index=1 to dim(dx) until(EPL_flag);
EPL_flag= dx[index] in: &epl_list. ;
end;
array px PROCEDURE_CODE ICD_PROCEDURE_CODE_1-ICD_PROCEDURE_CODE_25;
do index=1 to dim(px) until(excl_list_pm70154d);
excl_list_pm70154d = px[index] in: &excl_list_pm70154d.;
end;
run;
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
Still thinking about your presentation idea? The submission deadline has been extended to Friday, Nov. 14, at 11:59 p.m. ET.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.