SAS宏循环和虚拟变量

时间:2012-05-30 02:08:01

标签: loops macros sas

我只想在有一定值时制作新的虚拟变量。

这是我的原始数据示例。

ID A1 A2... A10
1  10   1    5
2  20   8   4
...
...

我希望在这些属性中存在某个值时添加虚拟变量。 例如,ID 1主题具有“10”,一个新变量,Add10将是1 ..

ID A1 A2.. A10 Add1..Add4 Add5...Add20

1  10   1.. 5  1  ...0   1  ...    0

2   20  8.. 4  0  ...1   0  ...     1

...

这是我的代码..

%MACRO DO_LIST;
%DO I=1 %TO 20;

data aaaa;
set aa33; 
if A1 =i or
A2 =i or
A3 =i or
...
A10 =i then Add&I=I ;
RUN;
%END;  
%MEND DO_LIST;
%DO_LIST;   

但是,我的结果只有Add20,这是最后一个变量.. 我觉得我在循环语句中犯了一个错误。你介意帮帮我吗? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

现在,您始终使用与aaaa输入相同的数据集,并且您不会在每个循环中更改此数据集。因此,您将始终只获得Add20,因为这是循环的最后一次迭代将执行的操作。

对此的一个简单解决方法是:

data append;
 set aa33;
run;

%MACRO DO_LIST;
%DO I=1 %TO 20;
data append; 
 set append;
 if A1 =i or
 A2 =i or
 A3 =i or
 .....
 A10 =i then Add&I=I ; 
RUN;
%END;
%MEND DO_LIST;
%DO_LIST;

每次循环运行时,您都希望在数据集中添加一列,而不是完全将其替换为原始数据集(aa33)和仅当前迭代的结果。

如果你知道max#是20,那么下面的代码应该没有宏

data test;
 set aa33;
 array add[20] 1. add1 - add20;
 array a[*] a:;

do i = 1 to dim(a);
  value = a[i];
  add[value] = 1;
end;
run;

我认为这就是你要找的东西,如果你至少填写你的例子的前两行,它会有所帮助。