我正在研究将改变数字1或0中存储为1/0或Y / N的数百个变量的编码的代码。因为这需要在一个灵活的过程中,我正在写一个宏来这样做。我对宏的唯一问题是我无法将SAS列名称传递给宏来工作。想法?
%Macro Test(S,E);
%Array(A,&S.-&E.);
%MEnd;
data subset;
set dataset);
%Test(v1,v20)
run;
答案 0 :(得分:1)
SAS支持变量列表。宏参数只是文本字符串。因此,只要您在SAS支持变量列表的位置使用宏变量值,就可以将变量列表传递给宏。例如,这里有一个简单的宏来创建一个数组语句。
%macro array(name,varlist);
array &name &varlist ;
%mend;
然后您可以在这样的数据步骤中使用。
data want;
set have ;
%array(binary,var1-var20 a--d male education);
do over binary; binary=binary in ('Y','1','T'); end;
run;
困难的部分是如果你想将变量从字符转换为数字,那么你需要重命名它们。这将使得使用变量列表(x1-x5或vara-vard)变得困难。您可以通过一些额外的逻辑来解决该问题,以将变量列表转换为单个名称列表。例如,您可以使用PROC TRANSPOSE创建一个数据集,其变量名称与列表匹配。
proc transpose data=&inds(obs=0) out=_names ;
var &varlist;
run;
然后,您可以使用此数据集生成代码或生成各个变量名称的列表。
proc sql noprint ;
select name into :varlist2 separated by ' ' from _names;
quit;
答案 1 :(得分:0)
所有变量名称的列表都存储在dictionary.columns数据集中。您可以访问它并将名称存储为一个列表,然后您可以循环遍历:
IEnumerable