SAS:传入阵列名称

时间:2016-04-21 18:42:41

标签: sas

我正在研究将改变数字1或0中存储为1/0或Y / N的数百个变量的编码的代码。因为这需要在一个灵活的过程中,我正在写一个宏来这样做。我对宏的唯一问题是我无法将SAS列名称传递给宏来工作。想法?

%Macro Test(S,E);
%Array(A,&S.-&E.);
%MEnd;

data subset;
    set dataset);
    %Test(v1,v20)
run;

2 个答案:

答案 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