BookmarkSubscribeRSS Feed
CathyVI
Lapis Lazuli | Level 10

Hello,

Am sorry I do not have a sample data for this question. I hope someone can still help me. I created the following code to identify the variable agegroup within the if-then-else statement but my output isn't what I wanted. My output only have  '< 15 yrs'. I wanted  newborn, months and days to be in one agegroup category for "0-14 yrs" while other patient_age should identify patient age in years.

 

data pt_age;
set patient_x;
if PATIENT_AGE <= 120 and pt_record in ("months" "days") then agegroup = '< 15 yrs';
if pt_record = "newborn" then agegroup = '< 15 yrs';
if PATIENT_AGE >=1 and PATIENT_AGE <=15 and pt_age_recode in ("years") then agegroup = '< 15 yrs';

if PATIENT_AGE >=16 and PATIENT_AGE <=34 and pt_age_recode in ("years") then agegroup = '16-34 yrs';
if PATIENT_AGE >=35 and PATIENT_AGE <=54 and pt_age_recode in ("years") then agegroup = '35-54 yrs';
if PATIENT_AGE >=55 and pt_age_recode in ("years") then agegroup = '55+ yrs';
run;

4 REPLIES 4
japelin
Rhodochrosite | Level 12

I don't think it's a problem with the SAS code, it's just that there are not enough conditional branches.
What I'm wondering is if there are records for age 0, 121-179 months, and 121-5474 days, the condition seems to be missing. If the data doesn't exist, it might not be a problem.

If you use if-then-do-end, or select-when-other, I think it will be a little more clear!
Please refer to the following
(This is untested, so please don't be offended)

 

/* use select */
  select (pt_record);
    when("newborn") do;
      agegroup = '< 15 yrs';
    end;
    when("days") do;
      if PATIENT_AGE <= 120 agegroup = '< 15 yrs';
    end;
    when("months") do;
      if PATIENT_AGE <= 120 agegroup = '< 15 yrs';
    end;
    when("years") do;
      select;
        when( 1 <= PATIENT_AGE <= 15) agegroup = '< 15 yrs';
        when(16 <= PATIENT_AGE <= 34) agegroup = '16-34 yrs';
        when(35 <= PATIENT_AGE <= 54) agegroup = '35-54 yrs';
        when(55 <= PATIENT_AGE      ) agegroup = '55+ yrs';
        otherwise;/* otherwise is same like else in if-else statements. But it should be written in the select statement, as it will cause errors for other conditions. */
      end;
    end;
    otherwise;
  end;
/* use if then else */
  if pt_record = "newborn" then agegroup = '< 15 yrs';
  else if pt_age_recode in ("years") then begin
    if       1 <= PATIENT_AGE <= 15 then agegroup = '< 15 yrs';
    else if 16 <= PATIENT_AGE <= 34 then agegroup = '16-34 yrs';
    else if 35 <= PATIENT_AGE <= 54 then agegroup = '35-54 yrs';
    else if 55 <= PATIENT_AGE       then agegroup = '55+ yrs';
  end else
  if pt_record in ("months" "days") then begin
    if PATIENT_AGE <= 120 agegroup = '< 15 yrs';
  end;
andreas_lds
Jade | Level 19

Can you please post an excerpt of the data you have, so that we actually see what you start with? Most likely using a format is the best way to solve the problem.

CathyVI
Lapis Lazuli | Level 10

So I'm still working on this question. I created a sample data for better understanding.

So this purpose is to identify age values in different 'agegroups' categories. For example,

0 is present in both years, months and days and I will like to have that in one group '< 15 yrs'

 

data test;

input patient_id patient_age patient_age_unit pt_age_code $;

datalines;

 

1231 24 2 months

1232 30 1 years

1233 3 1 years

1234 33 1 years

1235 0 0 newborn

1236 4 1 years

1237 0 1 years

1238 11 1 years

1239 90 1 years

1230 1 0 newborn

1212 0 2 months

1213 6 1 years

1214 11 2 months

1215 12 1 years

1216 0 3 days

1217 1 1 years

1218 34 1 years

1219 30 3 days

1220 1 2 months

1221 94 1 years

;

run;

 

I created this new codes but am not sure what else am doing wrong. Please help


data pt_age_grp (compress=yes keep= patient_id patient_age patient_age_unit pt_age_code agegroup );
set test;
  if pt_age_recode = "newborn" then
do;
    agegroup = '<15yrs';
end;
    else if patient_age <=30 and pt_age_recode = "days" then
do;
    agegroup = '<15yrs';
end;
    else if patient_age <=11 and pt_age_recode = "months" then
do;
    agegroup = '<15yrs';
end;
    else if 1 <= patient_age <=15 and pt_age_recode = "years" then
do;
    agegroup = '<15yrs';
end;
    else if 16 <= patient_age <= 34 and pt_age_recode = "years" then
do;
    agegroup = '16-34yrs';
end;
    else if 35 <= patient_age <= 54 and pt_age_recode = "years" then
do;
    agegroup = '35-54yrs';
end;
    else if patient_age >= 55 and pt_age_recode = "years" then
do;
    agegroup = '55+yrs';
end;
    else do;
    agegroup = 'Others';

end;
run;

japelin
Rhodochrosite | Level 12

If is not being evaluated correctly because pt_age_code and pt_age_recode are mixed up.

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 4 replies
  • 1039 views
  • 0 likes
  • 3 in conversation