Let's say I have the following:
data have;
input time count rate1 rate2 settings;
cards;
0.65 3 1.2 0.5 7
2.25 5 0.7 0.7 2
7 4 0.8 0.8 3
7 4 0.8 0.8 6
;
run;
Now I have the following rule for state '99':
data almost_want;
set have;
if
(time<=1 and (
(count>=1)
))
or
(1<time<=3 and (
(count>=2 and rate1>0.55 and rate2>0.4)
))
or
(3<time and (
(settings<=4 and count>=2 and rate1>0.55 and rate2>0.4)
or
(settings>=5 and count>=3 and rate1>0.55 and rate2>0.4)
))
then State=99;
run;
But what I actually want is this:
data want;
input time count rate1 rate2 settings State reason;
cards;
0.65 3 1.2 0.5 7 99 1
2.25 5 0.7 0.7 2 99 2
7 4 0.8 0.8 3 99 3
7 4 0.8 0.8 6 99 4
;
run;
So not only '99' but also because of which condition it is '99'.
In this example I have only one state cause it's enough to describe my problem but in the 'real' data it's five states with up to seven substatements per state.
Is there a way to find out which substatement of my if-condition was true?
So something like:
data almost_want;
set have;
if
(time<=1 and (
(count>=1)
then reason=1
))
or
(1<time<=3 and (
(count>=2 and rate1>0.55 and rate2>0.4)
then reason=2
))
or
(3<time and (
(settings<=4 and count>=2 and rate1>0.55 and rate2>0.4)
then reason=3
or
(settings>=5 and count>=3 and rate1>0.55 and rate2>0.4)
then reason=4
))
then State=99;
run;
Don't try to do it all in one statement.
if time <= 1 and count=1 then do;
reason=1;
state=99;
end;
else if (1 < time <= 3) and (count > 2 and rate1 > 0.55 and rate2 > 0.4) then do;
reason=2;
state=99;
end;
else .... similarly for other reasons
Using a few statements makes it easy.
Well, of course I could break it down in one if-statenment for every reason but I was hoping for an all-in-one-way...
@Emjay wrote:
Well, of course I could break it down in one if-statenment for every reason but I was hoping for an all-in-one-way...
Since you couldn't provide a rule in a very concise manner in English that is often a clue that the code will not be brief either. Five variables, a different set for each time interval value, a mix of combinations of values I would find a very unlikely candidate for "all-in-one-way" code whatever that might be.
BTW, you want to be aware that < or <= (or LT and LE) conditions are true when a value is missing. If you do not want the evaluation
Yes, the conditions are a little nested, but that's unfortunately as it is.
With all-in-one I wasn't necessarily hoping for super short code, but maybe for a way to mark the true if-condition without writing a if-statement for every single one. I thought SAS maybe provides such a functionality...
But thanks for the hint with the < and missing values. Luckily I don't have those.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.