Statistical programming, matrix languages, and more

How to evaluate a character expression to TRUE / FALSE ?

Reply
Occasional Contributor
Posts: 9

How to evaluate a character expression to TRUE / FALSE ?

[ Edited ]

I'd like to evaluate conditions that are stored in a character vector with an IF clause.

 

Ideally, the code below would print 2 and 3, but you'll noticed I used the vague denominator SomeFunction when evaluating the condition. My question is: Is there such a function, and if so, what's it named ?

 

proc iml;
	x = {1, 2 , 3, 4};
	cond = {"x[i] = 0", "x[i] > 0", "x[i] < 10", "x[i] = 10"};

	do i = 1 to 4;
		if SomeFunction(cond[i]) then do;
			print i;
		end;
	end;

quit;

 

 

If there is a 'cleaner' aproach to this, please let me know, I am not very familiar with IML so any advice is welcome.

 

SAS Super FREQ
Posts: 3,478

Re: How to evaluate a character expression to TRUE / FALSE ?

[ Edited ]

Why do you want to evaluate character strings? Are these conditions not known until run time?

 

The usual approach is to use the SAS logical operators ('&', '|' and '^') to form logical expressions:

For example, if you want the AND logic, use

 

proc iml;
x = {1, 2 , 3, 4};
do i = 1 to 4;
	if x[i] >= 0 & x[i] <= 10 then do;
		print i;
	end;
end;

If you have very complicated logic and you want to isolate it in a function call, you can do the following, which returns 0 (FALSE) or 1 (TRUE) for various situations:

start EvalArg(a);
   if a = 0 | a = 10 then 
      return 0;
   else if a > 0 & a < 10 then 
      return 1;
   else 
      return 0;
finish;

do i = 1 to 4;
   if EvalArg( x[i] ) then do;
      print i;
   end;
end;
Occasional Contributor
Posts: 9

Re: How to evaluate a character expression to TRUE / FALSE ?

[ Edited ]

Rick - thank you for the answer.
I think I didn't express myself clearly enough the first time: for each element in x there is a condition in cond. That condition can be different for each element, and I only need the elements in x for which the corresponding condition in cond evaluates to TRUE. 

 

I am NOT trying to concatenate all conditions into one and there is no connection bewtween the elements of cond.

 

Hopefully this makes more sense now.

SAS Super FREQ
Posts: 3,478

Re: How to evaluate a character expression to TRUE / FALSE ?

You didn't answer my question: Why do you want to evaluate character strings? Are these conditions known at the time that you write the program?

Occasional Contributor
Posts: 9

Re: How to evaluate a character expression to TRUE / FALSE ?

Some conditions are known, but some cannot be known beforehand (for instance, depending on the data, the variables that go into the condition are completely different).

The reason the 'fixed' conditions are in character strings is that they are read from an Excel file - the code has grown to a lot of line and it's easier to manage parameters and condition via Excel spraedsheets.

SAS Super FREQ
Posts: 3,478

Re: How to evaluate a character expression to TRUE / FALSE ?

You say the conditions are data dependent, but how are they determined? SAS/IML can be programmed to incorporate data-dependent conditions such as

if x[i] < max(x) then ...

or 

if x[i] >= mean(x) + std(x) then ...

 

Instead of asking "how to evaluate a character expression in a spreadsheet," why not tell us what you are trying to accomplish. there might be an easier way to program the analysis.

Super User
Posts: 9,681

Re: How to evaluate a character expression to TRUE / FALSE ?

Check CALL EXECUTEFILE()

 

another way is using data step to make a macro and execute it by %include  or CALL EXECUTE()

SAS Super FREQ
Posts: 3,478

Re: How to evaluate a character expression to TRUE / FALSE ?

Yes. As KSharp says, it is clear HOW to do it. The questions is WHY would we do it this way if there are more efficient alternatives. And we won't know that unless we understand the process by which the conditions are generated.

 

proc iml;
start EvalStrCondition(x, s);
   cmd = "b = (" + s + ");";
   call execute(cmd);
   return b;
finish;

x = {1, 2 , 3, 4};
cond = {"x = 0", "x > 0", "x < 10", "x = 10"};

do i = 1 to 4;
   if EvalStrCondition(x[i], cond[i]) then do;
      print i;
   end;
end;
Ask a Question
Discussion stats
  • 7 replies
  • 154 views
  • 3 likes
  • 3 in conversation