宏循环变量并存储结果SAS

时间:2016-07-21 19:11:17

标签: sas sas-macro

我有以下变量:A_Bldg B_Bldg C_Bldg D_Bldg。我想将它们乘以INTSF并将结果存储在一个新变量Sale_i中。例如,A_Bldg * INTSF = Sale_AB_Bldg * INTSF = Sale_B等。

我的代码是:

%macro loopit(mylist);
%let n=%sysfunc(countw(&mylist));
%do J = 1 %to &n;
%let i = %scan(&mylist,&J);

  data test;
  set data;
  sale_&i. = &i._Bldg * INTSF;
  run;

%end;
%mend;

%let list = A B C D;
%loopit(&list);

这只会产生Sale_D,这是列表中的最后一个字母。如何显示Sales A-C?前四行代码是如此,我可以遍历文本A-D。我想过用数组来做,但是不知道如何根据A-D指标选择变量。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您目前正在遍历列表并每次重新创建test数据集,因此它似乎只有sale_d,因为您只查看最后一次迭代。

您可以通过在一个数据步骤中扫描列表来清理循环,以解决您的问题:

%let list = A B C D;

%macro loopit;

    data test;
        set data;
            %do i = 1 %to %sysfunc(countw(&list.));
            %let this_letter = %scan(&list., &i.);
                sale_&this_letter. = &this_letter._Bldg * INTSF;
            %end;
    run;

%mend loopit;

%loopit;

答案 1 :(得分:1)

您的%DO循环位置错误。但实际上,您不需要使用宏代码来执行本机SAS代码已经可以执行的操作。

data want;
  set have ;
  array in A_Bldg B_Bldg C_Bldg D_Bldg ;
  array out sale_1-sale4 ;
  do i=1 to dim(in);
    out(i)=intsf*in(i);
  end;
run;