Help using Base SAS procedures

Macro statement in sas

Reply
Contributor
Posts: 33

Macro statement in sas

Hi,

I am performing a macro with statements :

%macro stuff ();

%do i=2 %to 6  ....... followed by series of statements and then macro end statement.

My question is when I write "%do i=2 %to 6", this mean that macro would perform on colum 2 to column 6 in my data set.

But if I want to skip column 4 and start macro function again from 5, then which statement should I write for "%do i=2 %to 6".

I have tried several different statements like

%do i=2 %to 3 and %do i=5 %to 6 but nothing is working.

Is there a way to do this in same statement or should I have to write it in altogether different syntax?

Thanks a lot for your suggestions.

PROC Star
Posts: 7,363

Macro statement in sas

I'm not sure if I understand what you are trying to do.  If I do understand you correctly, couldn't you just nest a %if statement in your code to skip the undesired column?  E.g.:

data have;

  input x1-x6;

  cards;

1 1 1 1 1 1

2 2 2 2 2 2

1 2 3 4 5 6

;

 

%macro stuff;

  data want;

    set have;

    %do i=1 %to 6;

      %if &i. ne 4 %then %do;

        x&i=x&i+1;

      %end;

    %end;

  run;

%mend;

 

%stuff

Occasional Contributor
Posts: 11

Re: Macro statement in sas

Hi,

specify the looping values directly..hope the below one helps.

%do i=2,3,5,6 ;

...

%end;

PROC Star
Posts: 7,363

Re: Macro statement in sas

Newbie, I don't think that the form you suggested will work with a %do loop.

Contributor
Posts: 33

Re: Macro statement in sas

Hi,

Thanks for your reply.

actually what I want is:

I have Questions 1 to 200 in my dataset as column.

For eg:

Role    Q1      Q2     Q3     Q4      Q5.......Q200

I have to perform a same macro function for Q5 to Q12 and Q100 to Q110. so in

%do i=5 to %to 12 statement, woould ie be possible for me to include Q100 to Q110 as well excluding all questions (i.e Q 13 toQ99) in between.

I am triying the shorten the code by avoiding wrting macro %do stratements again for Q100 to Q110 as I did for Q5 to Q12.

Is that possible?

PROC Star
Posts: 7,363

Re: Macro statement in sas

I'd still recommend nesting a %if statement.  e.g.,

%macro stuff;

  data want;

    set have;

    %do i=5 %to 110;

      %if &i. le 12 or &i. ge 100 %then %do;

        x&i=x&i+1;

      %end;

    %end;

  run;

%mend;

%stuff

Super User
Super User
Posts: 6,500

Re: Macro statement in sas

Are you sure you want a macro?  If you are performing these operations in a datastep then just make an array and loop of the array.

For example to recode 99 to missing for a select group of variables.

array m99 q5-q12 q100-q112 ;

do i=1 to dim(m99);

   if m99(i)=99 then varlist(i)=.;

end;

Now you cannot do the exact thing in macro language but you can get close by putting you list of variable names in one macro variable and assigning the variable name to another macro variable using a loop counter and the scan function.

%let varlist = q5 q6 q7 q8 q9 q10 q11 q12 q100 q101 q102 q103 q104 q105 q106 q107 q108 q109 q110;

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

    %let var=%scan(&varlist,&i);

   . . .

%end;

Contributor
Posts: 33

Re: Macro statement in sas

I tried this for different questions and my code looks likethis:

%macro stuff();

%let varlist = Q4 Q6 Q7 Q10 Q13;

%do i=4 %to %sysfunc(countw(&varlist.));

    %let var=%scan(&varlist.,&i.);

proc sql noprint;

create table test&i. as

select role, cats(count(Q&i.),'(',put(count(Q&i.)/count(*),percent8.),')') as C&i.

from data

    group by role;

quit;

%end;

%mend stuff;

%stuff;

Its giving me only 4 test data, test 4 test 5 test 6 and test 7. Also, I want my test data to br named as my selected questions. for eg: with above example the test data should be test 4, test 6, test 7, test 10 and test 13.

Super User
Super User
Posts: 6,500

Re: Macro statement in sas

Looks like you want to loop over a set of SUFFIXES and use those suffixes for both specifing the name of the output dataset and the variable name.

%macro stuff(suffixes);

%local i j ;

proc sql noprint;


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

%let j=%scan(&suffixes,&i);

  create table test&j as

    select role

         , cats(count(Q&j),'(',put(count(Q&j)/count(*),percent8.),')') as C&j

    from data

    group by role

  ;

%end;


quit;

%mend stuff;

%stuff(4 6 7 10 13);

Occasional Contributor
Posts: 11

Re: Macro statement in sas

@art297: i overlookd it.thanks for correcting

Super User
Posts: 9,681

Re: Macro statement in sas

Another way is to rename  your variable.

Such as:

proc datasets library=work nolist;

modify temp;

rename Q50-Q60=A1-A10 Q100-Q120=A11-A31;

quit;

Then use your loop macro code.

The macro code looks like my code?

Smiley Happy

Ksharp

Message was edited by: xia keshan

Ask a Question
Discussion stats
  • 10 replies
  • 227 views
  • 0 likes
  • 5 in conversation