【问题标题】:SAS macro loop and dummy variableSAS 宏循环和虚拟变量
【发布时间】:2012-05-30 02:08:01
【问题描述】:

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

这是我的原始数据示例。

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

【问题讨论】:

    标签: loops macros sas


    【解决方案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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多