2016-07-21 19 views
0

Ich habe die folgenden Variablen: A_Bldg B_Bldg C_Bldg D_Bldg. Ich möchte sie mit multiplizieren und das Ergebnis in einer neuen Variablen speichern, Sale_i. Zum Beispiel A_Bldg * INTSF = Sale_A, B_Bldg * INTSF = Sale_B und so weiter.Makro, um Variablen zu durchlaufen und Ergebnisse zu speichern SAS

Mein Code ist:

%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); 

Dies erzeugt nur Sale_D, die der letzte Buchstabe in der Liste ist. Wie bekomme ich Sales A-C angezeigt? Die ersten vier Codezeilen sind so, dass ich den Text A-D durchlaufen kann. Ich dachte darüber nach, es mit Arrays zu tun, wusste aber nicht, wie ich die Variablen auf Basis der A-D-Indikatoren auswählen sollte. Danke für Ihre Hilfe!

Antwort

1

Sie durchlaufen gerade Ihre Liste und erstellen das test-Dataset jedes Mal neu, sodass es scheinbar nur sale_d hat, da Sie nur die letzte Iteration anzeigen.

Sie können Ihre Schleife durch das Scannen durch die Liste in einem Daten Schritt aufzuräumen, um Ihr Problem zu lösen:

%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

Das hat funktioniert! Danke für Ihre Hilfe! – user3910919

1

Ihre %DO Schleife ist an der falschen Stelle. Aber wirklich müssen Sie Makrocode nicht verwenden, um etwas zu tun, das der native SAS-Code bereits tun kann.

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; 
Verwandte Themen