Home > database >  Using SAS macrovariables inside a SAS data step
Using SAS macrovariables inside a SAS data step

Time:10-16

I have a macrovariable &var_list which stores a list of integer variable names from the dataset have.

%put &var_list.;

id trt grade

Now I want to create a new dataset want where each of the above variable names itself becomes an array- and I need this done using macrovariables, because eventually my &varlist will have about a 1000 variables. I want macro code that creates a new data set where all the existing variables become arrays of length 4. Like so:

data want;

array id_var{4};

array trt_var{4};

array grade_var{4};

set have;

run;

I have tried the following macro code but it doesn't run correctly. I am trying to iterate through &var_list, concatenate the string "var" to the variable name and also add a {4} at the end to declare each variable as an array. But SAS complains that the keyword "array" is an undeclared array variable. It doesn't realise that I am trying to use the keyword array inside the %do macro. Also, what do I do about the {4} in the declaration statement?

%put &var_list.;

id trt grade

%macro getArrayData(dat);

data &dat;

%do i=1 %to 3;

       array %scan(&var_list,&i.)_var {4};

%end;

set have;
run;
%mend getArrayData;

%getArrayData(want);

CodePudding user response:

Aside: With the idea of eventually having 1,000 {4} item arrays you might want to consider using one 2-dimensional array {1000,4}

What does the log show when you turn on OPTIONS MPRINT;

The code you show does work correctly. I recommend coding var_list as a macro parameter instead of relying on a global macro variable.

data have;
run;

%macro getArrayData(dat, var_list);

data &dat;

%do i=1 %to 3;

       array %scan(&var_list,&i.)_var {4};

%end;

  set have;
run;
%mend getArrayData;

options mprint;

%getArrayData(want, a b c);

Log

56   %getArrayData(want, a b c);
MPRINT(GETARRAYDATA):   data want;
MPRINT(GETARRAYDATA):   array a_var {4};
MPRINT(GETARRAYDATA):   array b_var {4};
MPRINT(GETARRAYDATA):   array c_var {4};
MPRINT(GETARRAYDATA):   set have;
MPRINT(GETARRAYDATA):   run;

Depending on what columns are in have the above will create variables a_var1-a_var4 , b_var1-bvar4 , cvar1-cvar4

In general, a space separated list in macro is iterated as

%do index = 1 %to %sysfunc(countw(&list,%str( )));
  %let item = %sysfunc(scan(countw(&list,%str( )));

  /* do things with &item */

%end;
  • Related