我正在处理的代码将更改以数字1或0存储为1/0或Y/N的数百个变量的编码。因为这需要处于灵活的过程中,我正在写一个宏来这样做。我对宏的唯一问题是我无法将SAS列名传递给宏来工作。思考?SAS:传递数组名称
%Macro Test(S,E);
%Array(A,&S.-&E.);
%MEnd;
data subset;
set dataset);
%Test(v1,v20)
run;
我正在处理的代码将更改以数字1或0存储为1/0或Y/N的数百个变量的编码。因为这需要处于灵活的过程中,我正在写一个宏来这样做。我对宏的唯一问题是我无法将SAS列名传递给宏来工作。思考?SAS:传递数组名称
%Macro Test(S,E);
%Array(A,&S.-&E.);
%MEnd;
data subset;
set dataset);
%Test(v1,v20)
run;
所有变量名称的列表存储在dictionary.columns数据集中。您可以访问它并将名称存储为可以循环访问的列表:
proc sql noprint;
select name into: list_of_names
separated by " "
from dictionary.columns where memname = upcase("your_dataset");
quit;
%put &list_of_names.;
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;
我推荐使用proc sql;选择语句,从它建立你的datastep数组语句。这种方法会很慢。但你应该发布到Stack Exchange论坛,而不是在这里,因为你的问题不包含任何统计问题。 – StatsStudent