sql - 在 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;
解决方案
宏处理器只生成 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;
推荐阅读
- python - 我无法理解 python 中的套接字编程代码
- java - 处理客户端 -> 服务器连接(最大数量和最佳实践)
- java - 从堆栈跟踪中按名称获取类
- python - 在列表的第一列中查找元素,但返回第二列中的元素
- javascript - 如何直接从 msSaveOrOpenBlob 打开文件?
- typescript - 打字稿编译错误永远不会停止编译
- c# - 在屏幕中缩小时,部分视图会神奇地消失(Android 上的 Xamarin Forms)
- swift - 如何在 SwiftUI 中创建网格
- javascript - jQuery:在 .contents() 中排序
- javascript - 将请求中的数据绑定到选择输入 - React