BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
liyongkai800
Obsidian | Level 7

Hello, I want to resolve a series of macro variables in a do loop, but the following program doesn't work. For some reason, I can't

define the array for mac1-mac3. Any idea on how to resolve them directly?

 

%let mac1=2;
%let mac2=3;
%let mac3=7;
data test;
array gg{3} gg1-gg3 ;
do i=1 to 3;
gg{i}=dequote(cats('&','mac',put(i,best.)));
end;
run;

1 ACCEPTED SOLUTION

Accepted Solutions
Ksharp
Super User
%let mac1=2;
%let mac2=3;
%let mac3=7;
data test;
array gg{3} gg1-gg3 ;
do i=1 to 3;
gg{i}=symgetn(cats('mac',i));
end;
run;

View solution in original post

8 REPLIES 8
Ksharp
Super User
%let mac1=2;
%let mac2=3;
%let mac3=7;
data test;
array gg{3} gg1-gg3 ;
do i=1 to 3;
gg{i}=symgetn(cats('mac',i));
end;
run;
liyongkai800
Obsidian | Level 7
I appreciate your help, Ksharp. This is the second time you help me in time. Thanks so much.
RW9
Diamond | Level 26 RW9
Diamond | Level 26

Why would you put numerical data into character macro variables, then write a datastep to put them into a series of numerical variables in a dataset using implicit conversion?  The whole process seems bizarre?

data test;
  gg1=1;
  gg2=2;
  gg3=3;
run;

This is effectively what the code does?

liyongkai800
Obsidian | Level 7
The reason is that I calculate those macro variables in the earlier step and want to use them in later data step. My real program is like
data want;
set one;
Impose the do loop on set one(include that series of macro variables)
That might be bizarre for you, but as a fresh sas man, I can't come up with a better idea.
Kurt_Bremser
Super User

@liyongkai800 wrote:
The reason is that I calculate those macro variables in the earlier step and want to use them in later data step. My real program is like
data want;
set one;
Impose the do loop on set one(include that series of macro variables)
That might be bizarre for you, but as a fresh sas man, I can't come up with a better idea.

Anytime you have a series of data, consider to store it in a dataset. If you need it for look-up purposes, create a format from that dataset.

I basically only store singular pieces of data (like a cutoff date, or a company descriptor for filtering) in macro variables.

 

Think like that: the macro preprocessor helps you in making code dynamic. It is not designed (or meant) for handling data.

RW9
Diamond | Level 26 RW9
Diamond | Level 26

Just to add to that, you also use the ability to merge/join data as well.

Tom
Super User Tom
Super User

So if you have single observation dataset with those three variables you can include into a future and there is no need to move the values into macro variables at all.

Say you have the values in a dataset name SUMMARY and you want to combine that with another dataset named HAVE to produce a dataset named WANT.  You might code something like this:

data want ;
  if _n_=1 then set summary ;
  set have ;
  * Calculations using variables from HAVE and SUMMARY ;
run;

SAS will automatically retain the values of the variables from SUMMARY onto all iterations of the data step.

liyongkai800
Obsidian | Level 7
Thanks, I will take that for later program.

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 8 replies
  • 1944 views
  • 3 likes
  • 5 in conversation