首页 > 解决方案 > 在 SAS 中为公式 proc sql 使用宏

问题描述

我需要一些关于 SAS 宏的帮助。我想对变量求和(例如,从 v_1 到 v_7)以聚合它们,按年份分组。它们有很多,所以我想使用宏。但是,它不起作用(我只得到 v_1)我非常感谢您的帮助。

%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;

标签: sqlsassas-macro

解决方案


宏处理器只生成 SAS 代码,然后传递给 SAS 运行。您正在调用一个在 DATA 步中间生成完整 SAS 步的宏。因此,您正在尝试运行此代码:

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;

...

因此,首先您将 MY_TABLE 复制为 RUN_MACRO。然后,您使用 MY_TABLE 的折叠版本覆盖 MY_TABLE,该版本只有两个变量和每年只有一个观察值。然后您尝试再次折叠它,但正在引用一个不再存在的名为 V_2 的变量。

如果您只是在 SQL 语句的生成中移动 %DO 循环,它应该可以工作。也不要覆盖您的输入数据集。这是宏的版本将创建一个新的数据集名称 MY_NEW_TABLE,其中包含来自名为 MY_TABLE 的现有数据集的 8 个变量。

%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;

请注意,如果这就是您所做的一切,那么只需使用 PROC Summary。使用常规 SAS 代码而不是 SQL 代码,您可以使用变量列表,例如v_1-v_7. 所以不需要代码生成。

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

推荐阅读