2016-07-21 60 views
0

我有以下變量:A_Bldg B_Bldg C_Bldg D_Bldg。我想乘以並將結果存儲在一個新變量Sale_i中。例如,A_Bldg * INTSF = Sale_A,B_Bldg * INTSF = Sale_B等等。宏以循環變量並存儲結果SAS

我的代碼是:

%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指標選擇變量。謝謝你的幫助!

回答

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; 
+0

這工作!謝謝你的幫助! – user3910919

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;