2016-04-21 58 views
0

我正在处理的代码将更改以数字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; 
+0

我推荐使用proc sql;选择语句,从它建立你的datastep数组语句。这种方法会很慢。但你应该发布到Stack Exchange论坛,而不是在这里,因为你的问题不包含任何统计问题。 – StatsStudent

回答

0

所有变量名称的列表存储在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.; 
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;