Hi all,
I'm trying to write an iteration program and the main idea is that I want my program run multiple time and each time to use one value from a macro variable with a set of values.
The example code is as below:
data critlist;
input var1 var2;
datalines;
1.12 1.19
1.12 1.29
1.12 1.36
1.12 1.41
1.22 1.19
1.22 1.29
1.22 1.36
1.22 1.41
1.32 1.19
1.32 1.29
1.32 1.36
1.32 1.41
1.42 1.19
1.42 1.29
1.42 1.36
1.42 1.41
;
proc sql noprint;
select var1, var2 into :mvar1 separated by ' ', mvar2 separated by ' '
from critlist;
quit;
So my question is i don't know how to write my data step so that i can put the value from the macro variable into use:
data output; set input;
if ana_var > 1.12 *Here i don't know what to so that SAS will know if the the 1st value from &mvar1;
then ana_crit = "using 1.12"; *Here i don't know what to so that SAS will know if the the 1st value from &mvar1;
if ana_var > 1.19 *Here i don't know what to so that SAS will know if the the 1st value from &mvar2;
then ana_crit = "using 1.19"; *Here i don't know what to so that SAS will know if the the 1st value from &mvar2;
run;
then run this data step multiple times to use ALL values from &mvar1 and &mvar2.
so basically, i want to run my data step multiple times using each of the values i assigned to &mvar1 and &mvar2. But i don't know how to write the step....
Thanks!
Tina
Hi Tina @yahoo0806
I cannot figure out what you are trying to achieve, so I might be totally wrong in my solution, but the code works as a demonstration of how one can loop over the mvar lists, take the next values and use them in a data step.
If I can be of any further help, please write back.
Erik
*The example code is as below:;
data critlist;
input var1 var2;
datalines;
1.12 1.19
1.12 1.29
1.12 1.36
1.12 1.41
1.22 1.19
1.22 1.29
1.22 1.36
1.22 1.41
1.32 1.19
1.32 1.29
1.32 1.36
1.32 1.41
1.42 1.19
1.42 1.29
1.42 1.36
1.42 1.41
;
data input (drop=i); /* For this example the input ds must end with a 0 (zero); */
do i = 101 to 280 by 11;
ana_var = i / 100;
output;
end;
run;
proc sql noprint;
select var1, var2 into :mvar1 separated by ' ', : mvar2 separated by ' '
from critlist;
quit;
%let loopcount = &sqlobs;
%let input = input; /* input dsname into macro variable */
%let outputprefix = out; /* prefix for numbered output ds */
%macro m;
%do i = 1 %to &loopcount;
%let thislow = %scan(&mvar1,&i,%str( ));
%let thisuse = %scan(&mvar2,&i,%str( ));
%put &=thislow &=thisuse;
%if &i = 1 %then %let thisinput = &input;
%else %let thisinput = &outputprefix%eval(&i-1);
%put &=thisinput;
data &outputprefix&i; set &thisinput;
if ana_var > &thislow then ana_crit = catx(' ',"using","&thisuse");
run;
%end;
%mend;
%m;
Yes, please explain what you are trying to do here. I don't think you need macros at all, but then again, I don't understand the goal here.
If you have a list of value in a macro variable use %SCAN() to extract one of them.
%let i=1 ;
%put &=i %scan(&mvar1,&i,%str( ));
But why not just use your actual values instead of converting them from numbers into text and back again?
data output;
if _n_=1 then set crit (firstobs=&i obs=&i keep=var1 var2);
set input;
if ana_var > var1 then ana_crit = catx(' ','using',var1);
if ana_var > var2 then ana_crit = catx(' ','using',var2);
run;
Catch the best of SAS Innovate 2025 — anytime, anywhere. Stream powerful keynotes, real-world demos, and game-changing insights from the world’s leading data and AI minds.
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.
Ready to level-up your skills? Choose your own adventure.