cph_sto
cph_sto

Reputation: 7585

SAS: How to create datasets in loop based on macro variable

I have a macro variable like this:

%let months = 202002 202001 201912 201911 201910;

As one can see, we have 5 months, separated by space ' '.

I would like to create 5 datasets like a_202002, a_202001, a_201912, a_2019_11, a_201910. How can I run this in loop and create 5 datasets, instead of writing the datastep 5 times?

Pseudo code:

for m in &months.
    data a_m;
        ....
        ....
    run;

How can I do that in SAS? I tried %do_over but that did not help me.

Upvotes: 1

Views: 1532

Answers (3)

Tom
Tom

Reputation: 51566

You can use a %DO loop and the %SCAN() function. Use the COUNTW() function to find the upper bound.

%do i=1 %to %sysfunc(countw(&months,%str( )));
  %let month=%scan(&months,&i,%str( ));
  ....
%end;

Upvotes: 1

Richard
Richard

Reputation: 27508

Use the knowledge you gained from @Tom answer in an earlier question to create the macro

%macro datasets_for_months ...
  ...
%mend;

Specify the output data sets in the DATA statement:

DATA %datasets_for_months(...);
  ...
RUN;

Direct rows to specific output data sets by naming the data set, such as

  OUTPUT a_202002;

Note:

  • A step with no OUTPUT statements will implicitly output to each data set
  • A step with an OUTPUT statement will cause records to be written to either ALL data sets, or only the ones named in the statement:
    • OUTPUT writes records to all output data sets
    • OUTPUT data-set-name-1 writes records to only data sets specified

The DATA Step documentation covers what you need to know in greater detail

DATA Statement
Begins a DATA step and provides names for any output such as SAS data sets, views, or programs.
...
Syntax

Form 1:
DATA statement for creating output data sets

DATA <data-set-name-1 <(data-set-options-1)>>
... <data-set-name-n <(data-set-options-n)>> ... ;

THE ROAD AHEAD

You will likely discover that month will be better served in a conceptual role as a categorical variable in a single large data set, instead of breaking the data into multiple month-named data sets.

A categorical variable will let you leverage the power of SAS' partitioning and segregating statements such as WHERE, BY and CLASS when pursuing processing, reporting and visualization of your data at different combinations of class level values.

Upvotes: 2

PeterClemmensen
PeterClemmensen

Reputation: 4937

How about this approach? Create the data set names in another macro variable and use a single data step.

%let months = 202002 202001 201912 201911 201910;

data _null_;
   ds = prxchange('s/(\d+)/a_$1/', -1, "&months.");
   call symputx('ds', ds);
run;

options symbolgen;
data &ds.;
run;

Upvotes: 1

Related Questions