首页 > 解决方案 > 在 SAS 中从具有递增索引的宏变量创建变量

问题描述

我正在尝试从 SAS 宏中索引增加的宏变量创建变量,但我得到变量 aa_index 的缺失值,并且我得到 bb_index 的 0 值,这不应该是这种情况。请帮助我如何调整我的宏以正常工作。我的 SAS 宏如下所示;

    %macro cashflow_macro(index=,aa_1=,aa_2=,aa_3=,aa_4=,);
    /*create bb fields*/
    %put bb_1 = &aa_&index - &aa_(&index+1);
    %put bb_2 = &aa_(&index+1) - &aa_(&index+2);
    %put bb_3 = &aa_(&index+2) - &aa_(&index+3);

    /*create cc fields*/
    cc_1 = max(bb_1,0);
    cc_2 = max(bb_2,0);
    cc_3 = max(bb_3,0);
%mend;

data ccc;
%cashflow_macro(index=1,aa_1=400,aa_2=300,aa_3=250,aa_4=270);
run;

标签: sassas-macro

解决方案


主要将其从宏中取出并放入效率更高的数组中。

%macro cashflow_macro(index=,aa_1=,aa_2=,aa_3=,aa_4=,);

*create variable with index - 1 for other variables;
%let index1 = %eval(&index - 1);

 *declare arrays;
 array _aa (*) aa_1-aa_&index (
 %do i=1 %to &index;
     &&&aa_&i.
 %end;
    );
    
array _bb(*) bb_1 - bb_&index1;
array _cc(*) cc_1 - cc_&index1;

*calculations;
do i=1 to &index1;
_bb(i) = _aa(i) - _aa(i+1);
_cc(i) = max(_bb(i), 0);
end;




%mend;

data ccc;
 %cashflow_macro(index=4,aa_1=400,aa_2=300,aa_3=250,aa_4=270);
run;

还有一个可能更简化的版本:

%macro cashflow_macro_revised(series=);
   
    *create variable with index - 1 for other variables;
    %let index = %sysfunc(countw(&series));
    %let index1 = %eval(&index - 1);
    
     *declare arrays;
     array _aa (*) aa_1-aa_&index (&series);
        
    array _bb(*) bb_1 - bb_&index1;
    array _cc(*) cc_1 - cc_&index1;
    
    *calculations;
    do i=1 to &index1;
    _bb(i) = _aa(i) - _aa(i+1);
    _cc(i) = max(_bb(i), 0);
    end;




%mend;

data ccc;
     %cashflow_macro_revised(series=400 300 250 270);
run;

如果您真的想坚持使用宏,这将起作用,但会产生一些警告。我没有时间调试除此之外,但它似乎工作。

%macro cashflow_macro(index=4,aa_1=,aa_2=,aa_3=,aa_4=,);
   
    *create variable with index - 1 for other variables;
    %let index1 = %eval(&index - 1);
    

     %do i=1 %to &index1;
     
        %let bb_&i =  &&&aa_&i. - &&&aa_%eval(&i+1);
        bb_&i = &&&bb_&i.;
        cc_&i = max(&&&bb_&i, 0);
     %end;




%mend;



data ccc1;
%cashflow_macro(index=4,aa_1=400,aa_2=300,aa_3=250,aa_4=270);
run;


推荐阅读