DATA Step, Macro, Functions and more

IF THEN Confusion.

Accepted Solution Solved
Reply
Contributor
Posts: 61
Accepted Solution

IF THEN Confusion.

data have;
input type$ @@;
datalines;
A B
;
data next;
set have;
if type=. or type=' ' then type_ind=0;
else if type='A' then type_ind=1;
else type_ind=2;
run;


can somebody tell me whey type_ind return all 0?
I know remove 'type=.' will fix the problem,
but how that piece of code affects the results?
Shouldn't it be ignored in the process?

 

Thanks.

 

Joe


Accepted Solutions
Solution
‎05-25-2016 12:13 PM
Super User
Super User
Posts: 7,039

Re: IF THEN Confusion.

You asked SAS to convert your character variable TYPE to a number so that it could compare it the numeric missing value. Since 'A' and 'B' cannot convert to numbers the result is a missing value.  Hence your IF condition is true.  Either use the MISSING() function as it will handle both numeric and character values.  

if missing(TYPE) then ...

You clearly know that TYPE is character since your other IF statements reference values like 'A', so why did you try to compare TYPE to numeric missing value?  Perhaps you do not understand how SAS stores character variables?  SAS stores character variables as fixed length strings that automatically padded on the right with spaces.  It will trim trailing spaces in most comparisons automatically and treats a values that only contains spaces the same as a missing value.

View solution in original post


All Replies
Occasional Contributor
Posts: 7

Re: IF THEN Confusion.

This i sbecause you care comparing character variable with numerical value. This will work

data have;
input type $ @@;
datalines;
A B
;
data next;
set have;
if  type=' ' or missing(type) then type_ind=0;
else if type='A' then type_ind=1;
else type_ind=2;
run;
Contributor
Posts: 61

Re: IF THEN Confusion.

Posted in reply to umeshMahajan
shouldn't SAS ignore the wrongful comparison anyway?
Solution
‎05-25-2016 12:13 PM
Super User
Super User
Posts: 7,039

Re: IF THEN Confusion.

You asked SAS to convert your character variable TYPE to a number so that it could compare it the numeric missing value. Since 'A' and 'B' cannot convert to numbers the result is a missing value.  Hence your IF condition is true.  Either use the MISSING() function as it will handle both numeric and character values.  

if missing(TYPE) then ...

You clearly know that TYPE is character since your other IF statements reference values like 'A', so why did you try to compare TYPE to numeric missing value?  Perhaps you do not understand how SAS stores character variables?  SAS stores character variables as fixed length strings that automatically padded on the right with spaces.  It will trim trailing spaces in most comparisons automatically and treats a values that only contains spaces the same as a missing value.

Contributor
Posts: 61

Re: IF THEN Confusion.

Thanks for the detailed explanation.
☑ This topic is solved.

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

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