SAS按条件生成变量名宏列表后宏变量无法正常识别问题求助
SAS宏变量未生效问题解决
问题根因
- 默认情况下,在SAS宏内部通过
PROC SQL INTO创建的宏变量属于局部宏变量,仅在宏运行的生命周期内有效,宏执行完成后会被自动销毁,因此宏外部无法访问。 - 另外当前代码还有两个隐藏问题:
- 变量列表分隔符用了逗号,而SAS
sum()函数的多个参数需要用空格分隔,直接使用会报错 - 最终求和代码里
pop_white = sum(white);漏写了宏变量引用符&
- 变量列表分隔符用了逗号,而SAS
修复方案
直接在宏内部提前声明要创建的宏变量为全局变量,同时修改分隔符即可,修改后的宏代码如下:
%let racecat = white black aian asian nhppi latinx; %let race = 'W' 'B' 'I' 'A' 'P' 'H'; %macro varlist_race; %let varnum= %sysfunc(countw(&racecat.)); %do i=1 %to &varnum.; %let nextgroup= %scan(&racecat.,&i); /* 声明宏变量为全局,宏运行后不会被销毁 */ %global &nextgroup.; proc sql noprint; /* 加noprint避免不必要的结果输出 */ select strip(name) into :&nextgroup separated by " " /* 用空格分隔,适配sum函数参数要求 */ from varname where race =%scan(&race.,&i) ; quit; %end; %mend varlist_race; %varlist_race;
修改后的求和代码如下:
data pop2019_sums; set pop2019; pop_white = sum(&white); pop_black = sum(&black); pop_asian= sum(&asian); run;
拓展优化(可选)
如果后续还要做年龄组+种族的交叉汇总,也可以用同样的逻辑,先在varname数据集里给每个变量打上年龄组标签,再用相同的宏逻辑生成交叉维度的变量列表即可,不需要手动拼接变量名。
内容的提问来源于stack exchange,提问作者Megan Halbrook
相关产品推荐
相关产品推荐

