简体   繁体   中英

Using macro for formula proc sql in SAS

I need some help with macros in SAS. I want to sum variables (for example, from v_1 to v_7) to aggregate them, grouping by year. There are plenty of them, so I want to use macro. However, it doesn't work (I get only v_1) I would really appreciate Your help.

%macro my_macro();
%local i;
%do i = 1 %to 7;

proc sql;
create table my_table as select 
year,
sum(v_&i.) as v_&i.
from my_table
group by year
;
quit;

%end;
%mend;

/* I don't know to run this macro - is it ok? */
data run_macro;
set my_table;
%my_macro();
run;

The macro processor just generates SAS code and then passes onto to SAS to run. You are calling a macro that generates a complete SAS step in the middle of your DATA step. So you are trying to run this code:

data run_macro;
  set my_table;

proc sql;
create table my_table as select 
year,
sum(v_1) as v_1
from my_table
group by year
;
quit;

proc sql;
create table my_table as select 
year,
sum(v_1) as v_1
from my_table
group by year
;
quit;

...

So first you make a copy of MY_TABLE as RUN_MACRO. Then you overwrite MY_TABLE with a collapsed version of MY_TABLE that has just two variables and only one observations per year. Then you try to collapse it again but are referencing a variable named V_2 that no longer exists.

If you simply move the %DO loop inside the generation of the SQL statement it should work. Also don't overwrite your input dataset. Here is version of the macro will create a new dataset name MY_NEW_TABLE with 8 variables from the existing dataset named MY_TABLE.

%macro my_macro();
%local i;

proc sql;
create table my_NEW_table as 
  select year
%do i = 1 %to 7;
       , sum(v_&i.) as v_&i.
%end;
  from my_table
  group by year
;
quit;

%mend;
%my_macro;

Note if this is all you are doing then just use PROC SUMMARY. With regular SAS code instead of SQL code you can use variable lists like v_1-v_7 . So there is no need for code generation.

proc summary nway data=my_table ;
  class year ;
  var v_1 - v_7;
  output out=my_NEW_table sum=;
run;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM