0

我只想在有某个值时创建新的虚拟变量。

这是我的原始数据示例。

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,这是最后一个变量。我觉得我在循环语句中出错了。你介意帮助我吗?提前致谢。

4

1 回答 1

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;

我认为这就是您要查找的内容,如果您至少填写示例的前两行,这会有所帮助。

于 2012-05-30T12:21:02.977 回答