2012-05-30 105 views
0

我只想在有一定的值时创建新的虚拟变量。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

现在,您始终使用与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)完全取代它的时间和结果添加到您的数据集只有当前的迭代。

如果你知道规定的上限是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; 

工作,我认为这是你在找什么,它会帮助,如果你至少填写前两个整行的例子。

+0

谢谢soooooo多!! – user976856