【问题标题】:Using macro for formula proc sql in SAS在 SAS 中为公式 proc sql 使用宏
【发布时间】:2021-04-07 15:28:27
【问题描述】:

我需要一些有关 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;

【问题讨论】:

    标签: sql sas sas-macro


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多