DATA Step, Macro, Functions and more

If-then-else

Accepted Solution Solved
Reply
New Contributor Y_S
New Contributor
Posts: 3
Accepted Solution

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:

 

namelevelexp
Alfred.Unknown
Alice2Medium
Barbara2Medium
Carol3Medium
Brut4Medium
Kelly.Unknown
Juan1Low

 

 

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

 


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

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

View solution in original post


All Replies
Contributor
Posts: 56

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 Y_S
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: 56

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: 7,782

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
☑ This topic is solved.

Need further help from the community? Please ask a new question.

Discussion stats
  • 4 replies
  • 316 views
  • 3 likes
  • 3 in conversation