最近,项目中有一个新的Table任务,Table的布局与曾做过的相同,唯一区别是,两个治疗组使用的分析变量不一样了。简单讲,试验组和对照组之前都是使用变量A作为分析变量;现在要求试验组使用变量A作为分析变量,对照组使用变量B。
常规生成不同试验组统计量的做法是,组别作为By变量,直接用一个程序生成多组结果。新表的布局与之前一摸一样,我想省点事,直接使用之前的代码。这样就需要将两个不同的分析变量,合并成一个。
思路很简单:
if trt="试验组" then anlvar = A;
if trt="对照组" then anlvar = B;
再简单一点的思路(变量B作为分析变量):
if trt="试验组" then B = A;
用赋值语句就可以合并2个分析变量,没什么难度。有点麻烦的是,新的分析变量保存在一个数据集中,并且数量有不少。这意味着代码里需要针对每一个分析变量写一个赋值语句。类似这样:
if trt="试验组" then do;
B1 = A1;
B2 = A2;
B3 = A3;
B4 = A4;
...
end;
新的分析变量与之前的相比只是多了相同的后缀,由于变量有点多,单纯地对照着数据集,手动写赋值语句,我觉得很繁琐。这时候脑子冒出批量操作的想法,首先联想到之前批量删除变量的方法,如何批量删除SAS数据集中的特定变量--Call Execute。扫了眼文章内容发现,Call Execute
使用在当下这种情况有点不合适,之前是在多个数据集中进行操作删除操作,如今是在一个数据集中进行多个赋值语句。如果硬写,可能导致一个赋值语句需要一个Data步,程序运行太低效了。我就没往这个方向考虑。
理了理思路,上面列举的繁琐赋值语句是无法省略的,我想省略的是手动写这些语句的功夫。如果要“自动”写出这些语句,我就要先找出那些新的分析变量,想到这里思路一下子清晰了。(我用SASHELP.CLASS数据集进行演示)
首先,找出那些需要分析,这里需要查看具体数据集中的变量名称,使用SAS字典。
proc sql noprint;
create table test as
select *
from dictionary.columns
where libname = "SASHELP" and memname = "CLASS";
quit;
数据集中的部分内容如下:
有了变量名信息,接下来就是构建赋值语句,并把赋值语句保存到宏变量中,方便调用。
proc sql noprint;
create table test as
select name, strip(name)||"_New" as name_new, strip(name)||"_New"||" = "||strip(name)||";" as anlvar
from dictionary.columns
where libname = "SASHELP" and memname = "CLASS";
select anlvar into: anlvar separated by " " from test;
quit;
这样赋值语句完全保留在宏变量中可以直接调用了:
if trt="试验组" then do;
&anlvar.
end;
若有疑问欢迎评论区留言讨论!