I am using a loop in datastep to load files together and analyze.
Is there any other simpler and faster way ??
%macro test();
%let C_k_09_3 = 3;
%let C_k_09_4 = 6;
%let C_k_09_5 = 6;
%let C_k_09_3_H = %sysevalf(&C_k_09_3 + 2); %let C_k_09_3_L = %sysevalf(&C_k_09_3 - 2);
%let C_k_09_4_H = %sysevalf(&C_k_09_4 + 2); %let C_k_09_4_L = %sysevalf(&C_k_09_4 - 2);
%let C_k_09_5_H = %sysevalf(&C_k_09_5 + 2); %let C_k_09_5_L = %sysevalf(&C_k_09_5 - 2);
data test;
set
%do i = &C_k_09_3_L %to &C_k_09_3_H ;
%do j = &C_k_09_4_L %to &C_k_09_4_H ;
%do k = &C_k_09_5_L %to &C_k_09_5_H;
test__&i&j&k
%end;
%end;
%end;
;
run;
%mend test;
%test;
So you have three input parameters, each specifying the center point of a loop that runs for 5 elements.
I would build the list in a data step.
Why?
%let l1=3;
%let l2=6;
%let l3=6;
data _null_;
length setlist $32767;
do i = &l1. - 2 to &l1. + 2;
do j = &l2. - 2 to &l2. + 2;
do k = &l3. - 2 to &l3. + 2;
setlist = catx(" ",setlist,cats("test__",i,j,k));
end;
end;
end;
call symputx('setlist',setlist);
run;
data test;
set &setlist.;
run;
Hi @makset
There is nothing wrong with the way you use the macro to generate the set items. I cant' se that could be done simpler or more effecient.
Your calculation is very complicated. As there are no decimal values here, you could use %eval instead of %sysevalf and get the same. But it might be easier to specify the sets of low and high values for each position:
%macro test();
%let ilow = 1; %let ihigh = 5;
%let jlow = 4; %let jhigh = 8;
%let klow = 4; %let khigh = 8;
data test;
set
%do i = &ilow %to &ihigh;
%do j = &jlow %to &jhigh;
%do k = &klow %to &khigh;
test__&i&j&k;
%end;
%end;
%end;
;
run;
%mend test;
%test;
So you have three input parameters, each specifying the center point of a loop that runs for 5 elements.
I would build the list in a data step.
Why?
%let l1=3;
%let l2=6;
%let l3=6;
data _null_;
length setlist $32767;
do i = &l1. - 2 to &l1. + 2;
do j = &l2. - 2 to &l2. + 2;
do k = &l3. - 2 to &l3. + 2;
setlist = catx(" ",setlist,cats("test__",i,j,k));
end;
end;
end;
call symputx('setlist',setlist);
run;
data test;
set &setlist.;
run;
If I, J, or K exceed 9 you will have the possibility of the SET list have the same data set listed twice. This is because concatenation &I&J&K has no delimiters between the resolved values, likely due to naming convention of the TEMP__ tables.
Example:
TEMP__1111 would be listed three times in SET if the I,J,K loops were 1 to 11
- 11, 1, 1
- 1, 11, 1
- 1, 1, 11
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.