Solved
New Contributor
Posts: 3

# If-then-else

data a;

input name \$8. level 1.;

cards;

Alfred 1

Alice 2

Barbara 2

Carol 3

Brut 4

Kelly .

Juan 1

;

run;

data exp;

set a;

if level =. then exp = 'Unknown';

else if level = 1 then exp = 'Low';

else if level= 2 or 3 then exp ='Medium';

else exp = 'high';

run;

The output dor dataset exp is as below:

 name level exp Alfred . Unknown Alice 2 Medium Barbara 2 Medium Carol 3 Medium Brut 4 Medium Kelly . Unknown Juan 1 Low

Not sure why for level 4 exp is 'Medium'?

Accepted Solutions
Solution
‎01-18-2016 09:41 PM
Super User
Posts: 10,215

## Re: If-then-else

[ Edited ]
``else if level= 2 or 3 then exp ='Medium';``

is translated as

``if (level = 2) or (3)``

Now, in SAS the boolean value of "false" is represented by the number zero; any other numerical value means "true". "3" is therefore always true, and makes the whole condition always true, meaning that the branch for "high" will never be entered.

Edit: Heh, Josh beat me to it.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
How to convert datasets to data steps
How to post code

All Replies
Contributor
Posts: 57

## Re: If-then-else

You would need to use the 'in' operator or list out each condition of the 'or' operator for the 'Medium' assignment.

``````else if level in(2 3) then exp ='Medium';

/* or */

else if level = 2 or level = 3 then exp = 'Medium';``````

I would also recommend you take a look at PROC FORMAT. It is useful for assignment logic like this.

New Contributor
Posts: 3

## Re: If-then-else

Thanks for the solution, but I am intrested in understanding why exp for level  4 is 'Medium' when datastep written in that way.

Contributor
Posts: 57

## Re: If-then-else

Not 100% sure, but my hunch is that the expression is being evaluated like so..

if (level = 2) or ( 3 )

For your observation in question, level = 2 is evaulated as false, but (3) on it's own is always true. It would be like saying if 3 ^= .

The if statement returns a value of true, thus the assignment of 'Medium' takes place.

Solution
‎01-18-2016 09:41 PM
Super User
Posts: 10,215

## Re: If-then-else

[ Edited ]
``else if level= 2 or 3 then exp ='Medium';``

is translated as

``if (level = 2) or (3)``

Now, in SAS the boolean value of "false" is represented by the number zero; any other numerical value means "true". "3" is therefore always true, and makes the whole condition always true, meaning that the branch for "high" will never be entered.

Edit: Heh, Josh beat me to it.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
How to convert datasets to data steps
How to post code
🔒 This topic is solved and locked.