Can a do loop iterate over a list instead of a range?

Accepted Solution Solved
Reply
Contributor
Posts: 22
Accepted Solution

Can a do loop iterate over a list instead of a range?

Let's say I have five datasets (dat1, dat2, dat3, dat6, and dat8) and I have a few operations I need to apply to each of them. I could, of course, just write out a separate data step for each data set, but I'm wondering if there's a way to combine it into a macro, something like the following:

%macro dostuff;

     %do i in (1 2 3 6 8);

          data dat&i; set dat&i;

               <operations>

              run;

     %end;

%mend;

%dostuff;

Similarly, could I iterate over a series of characters? (e.g. do i in ("horse" "giraffe" "pony" etc...) )


Accepted Solutions
Solution
‎04-08-2015 04:29 PM
Trusted Advisor
Posts: 1,498

Re: Can a do loop iterate over a list instead of a range?

%macro oink;

%let list=1 2 3 6 8;

%do i=1 %to %sysfunc(countw(&list));

  %let value=%scan(&list,&i,%str( ));

  %put value &value;

%end;

%mend;

%oink

Works if &list is character or numeric or mixed.

View solution in original post


All Replies
Solution
‎04-08-2015 04:29 PM
Trusted Advisor
Posts: 1,498

Re: Can a do loop iterate over a list instead of a range?

%macro oink;

%let list=1 2 3 6 8;

%do i=1 %to %sysfunc(countw(&list));

  %let value=%scan(&list,&i,%str( ));

  %put value &value;

%end;

%mend;

%oink

Works if &list is character or numeric or mixed.

Esteemed Advisor
Posts: 7,294

Re: Can a do loop iterate over a list instead of a range?

Similarly, you can accomplish the same thing by using call execute. e.g.:

data cow horse pig;

  set sashelp.class;

run;

data _null_;

  length excmd $255;

  length dset $32;

  do dset='cow', 'horse', 'pig';

    excmd=catx(' ','data',dset,'; set',dset,';');

    call execute(excmd);

    excmd='newheigt=height-20;';

    call execute(excmd);

    call execute('run;');

  end;

run;

☑ This topic is SOLVED.

Need further help from the community? Please ask a new question.

Discussion stats
  • 2 replies
  • 229 views
  • 3 likes
  • 3 in conversation