宏处理器只生成 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;