BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
michan22
Quartz | Level 8

Hi everyone,

 

I need some guidance on the following:

My dataset contains 45 observations and 4 variables: cough, fever, sweats, flu; each variable is numerical with choices 1=<2 months, 2=3-4 months, 3=5-6 months, 4=>6 months, 9=unknown.

I need to create a new variable called 'anysymptom' where it would give me the longest duration for any of these symptoms (e.g. for observation 1 that has cough=1 fever=2 sweats=4 flu=9, the new variable would return 4, which is >6 months).

There are also missing values for some of the observations.

Is there a function I could utilize for this?

Any advise is appreciated!

 

Thanks!

 

1 ACCEPTED SOLUTION

Accepted Solutions
ChrisNZ
Tourmaline | Level 20

Like this?

LONGEST=max(FLUE*(FLUE<9), COUGH*(COUGH<9), SWEAT*(SWEAT<9), FEVER*(FEVER<9));

View solution in original post

5 REPLIES 5
WarrenKuhfeld
Ammonite | Level 13

anysymptom = max(ifn(cough eq 9, ., cough),

                                  ifn(fever eq 9, ., fever),

                                  ifn(sweats eq 9, ., sweats),

                                  ifn(flu eq 9, ., flu));

If there were a lot of variables you could use an array and a loop.

Reeza
Super User

If the 9 wasn't there this would be much easier, there's the LARGEST/MAX functions. This probably could be tweaked but I suspect @WarrenKuhfeld is probably the easiest or some form of a basic loop where you can ignore the 9. 

 

In this solution, I use the LARGEST() function and loop if it's a 9 so you're not looping through all the variables, only until you find one the largest that's not a 9. 

 

data test;
    a=1;
    b=2;
    c=3;
    d=9;
    output;
    a=2;
    b=3;
    c=3;
    d=4;
    output;
    a=9;
    b=9;
    c=9;
    d=9;
    output;
run;

data want;
    set test;

    array vars(*) a b c d;
    
    maxv=.; i=1;

    do until (maxv ne 9 or i=dim(vars));       
        maxV=largest(i, of vars(*));
        i+1;
    end;

    if maxV=9 then maxV=.;
       
run;

proc print data=want;
run;
art297
Opal | Level 21

Here is one way:

proc format;
  value symptom
  9=0
  ;
run;

data want (drop=i);
set have;
array symptoms(*) cough--flu;
do i=1 to dim(symptoms);
symptoms(i)=put(symptoms(i),symptom.);
end;
anysymptom=max(of symptoms(*));
run;

Art, CEO, AnalystFinder.com

ChrisNZ
Tourmaline | Level 20

Like this?

LONGEST=max(FLUE*(FLUE<9), COUGH*(COUGH<9), SWEAT*(SWEAT<9), FEVER*(FEVER<9));

michan22
Quartz | Level 8

Thank you all for the wonderful advice!

SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!

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
  • 5 replies
  • 869 views
  • 5 likes
  • 5 in conversation