Help using Base SAS procedures

change variable name with each iteration.

Reply
N/A
Posts: 0

change variable name with each iteration.

Hi,

I have a list of variables in a data set.

Lets call them A1B, A2B..... A100B;

I need to write a do loop such that i can use the iteration value to call the variable.

data dataset;
set dataset;

counter = 0;
do i = 1 to 100;
if A&iB = etc... (how do i call the variable passing the iteration value)
counter+1;
end;

run;
Super Contributor
Super Contributor
Posts: 3,174

Re: change variable name with each iteration.

Explore using an ARRAY in your DATA step, where you can list the variables contained in the array and you would use an "index variable" to iterate through the variable list without having to name each variable within your DO/END code.

Scott Barry
SBBWorks, Inc.

Recommended Google advanced search argument this topic/post:

data step array site:sas.com
Regular Contributor
Posts: 165

Re: change variable name with each iteration.

A&i.B should resolve to the correct variable I think.
Super Contributor
Super Contributor
Posts: 3,174

Re: change variable name with each iteration.

To the OP: you cannot (normally) mix SAS macro language elements with DATA step code. If you add this SAS statement to your code, you will get more diagnostic information showing how/when the macro code is compiled and when the DATA step code is compiled and executed.

OPTIONS SOURCE SOURCE2 MACROGEN SYMBOLGEN MPRINT;

...and for DATA step diagnostics, add...

PUTLOG '>I AM HERE>' / _ALL_;

Scott Barry
SBBWorks, Inc.

Recommended Google advanced search argument this topic/post:

macro language basics introduction site:sas.com
New Contributor
Posts: 4

Re: change variable name with each iteration.

After declare i as a macro variable first.

%let i=100;
...
a&i.b=...
....
Regular Contributor
Posts: 165

Re: change variable name with each iteration.

Correct,

I overlooked that this was in a data step and not macro code when I saw the &.
SAS Super FREQ
Posts: 8,744

Re: change variable name with each iteration.

Hi:
Although there are many instances where you might use a macro %DO loop, when generating code, it does not seem necessary to make this code task more difficult by introducing macro variables into the mix. It will only complicate debugging the logic and output should things not work as expected.

Consider the program below:
[pre]
data usearray;
set sashelp.class;
array silly a1b a2b a3b a4b a5b;
do i = 1 to 5 by 1;
silly(i) = age +i;
end;
run;

ods listing;
proc print data=usearray;
var name age a1b a2b a3b a4b a5b;
run;
[/pre]


In my program, above, the ARRAY statement declares an ARRAY named SILLY to hold 5 variables: A1B through A5B. The variables do NOT have to be similarly named, they must only be of the same type (all numeric or all character). A SAS ARRAY is just a convenient method for referencing a group of variables.

Then I have a regular DATA step DO loop, iterate from 1 to 5. I could have used the DIM function; I could have used a DO WHILE or a DO UNTIL loop (but then I would have been responsible for iterating the counter or index variable on my own).

The statement: silly(i) = age +i;
shows the referencing method that you can use AFTER an ARRAY has been declared in a program. When the value of I is 1 then silly(i) refers to the first variable in the ARRAY list, A1B, when the value of I is 2 then silly(i) refers to the second variable in the ARRAY list...and so on.

There are many other reasons for using a macro %DO loop or using macro variable references in a program. However, a simple &i will not iterate on it's own
-AND- a simple &i reference is probably inappropriate in a DATA step program because of issues with DATA step compile time, DATA step execution time, macro code resolution time and when you want your macro variable to resolve. Simple &MACVAR references (such as &I or &A) resolve at DATA step compile time AND THEN DO NOT CHANGE. So these simple &MACVAR references are only good for providing constant values, such as data set names, constant multipliers (used as constants in the program) or items that change for every iteration of the program, but stay the same for every observation in the data set.

As I said, a SAS Array is a very simple way of referencing a collection of variables. For example, if you wanted to check ALL the numeric variables in your data and change missing values to 0, you would do something like this:
[pre]
array allnum _numeric_;
do i = 1 to dim(allnum);
if allnum(i) = . then allnum(i) = 0;
end;
[/pre]

A technique like this saves you coding time, because you do NOT have to name all the variables in separate IF statements. There are other naming constructs you can use with your variable lists and the SAS documentation outlines all the different ways you can name and list variables.

If you needed to generate a PROC PRINT step 100 times or generate an IF statement 100 times, or generate a list of 1000 variable names -- to use in a program, those might be some of the instances where you would use a MACRO %DO loop inside a MACRO program. But you should know that a MACRO %DO loop is rarely a substitute for an ARRAY statement for simple iteration through a group of variables.

cynthia
Ask a Question
Discussion stats
  • 6 replies
  • 1504 views
  • 0 likes
  • 5 in conversation