2016-04-04 4 views
1

Ich habe SAS-Code unten und kann dann ausgeführt werden. Die Herausforderung ist, dass ich sie so oft wiederholen muss und es sieht wirklich peinlich aus. Ich brauche Trans1-Tran2, TransOut1-TransOut100, und die BBB, AAA, VCS sind benutzerdefiniert und kein Trend zu folgen.SAS-Code, Loop-Index und mehr, wie zu vereinfachen

%transform(Trans1,BBB,TransOut1); 
%transform(Trans2,AAA,TransOut2); 
%transform(Trans3,VCS,TransOut3); 
%transform(Trans4,REM,TransOut4); 

Ich denke kombinieren Schleife tun und Scannen in meinem Code, aber ich weiß nicht, wie Index im Variablennamen verwenden, so kann ich nicht meine Idee testen. Beispielcode, der nicht ausgeführt werden kann.

%let second= BBB, AAA, VCS,REM;  
%macro trans; 
%do i=1 %to 4; 
%transform(Trans(i)?,%scan(&second.,&i),TransOut(i); 
%end; 
%mend; 

poste ich einige Testcode unten:

%macro test(data, var); 
Data &data.; 
Fname= "John"; 
Phone= 123; 
City="Chicago"; 
Zip=65456; 
keep &var.; 
Run; 
%mend; 


%test(test1, Phone); 
%test(test2, Fname); 
%test(test3, City); 
%test(test4, Zip); 

Antwort

2

Sie haben es fast richtig bereits. (Am besten lassen Sie das Komma in Ihrer Liste).

%let second= BBB AAA VCS REM;  
%macro trans; 
%do i=1 %to 4; 
%transform(Trans&i,%scan(&second.,&i),TransOut&i); 
%end; 
%mend; 

Wenn Sie mit einer langen Liste zu tun haben, sollten Sie prüfen, Anruf mit ausführen:

data init; 
    input index userDef $; 
    datalines; 
1 AAA 
2 BBB 
3 VCS 
4 REM 
; 
run; 

data _null_; 
    set init; 
    call execute(
       cats(
        '%transform(Trans', index, ',', userDef, ',TransOut', index,')' 
        ) 
       ); 
run; 

edit: Katzen jetzt verwenden, wie von Joe vorgeschlagen

+3

'Katzen' ist viel besser für die tatsächlicher Aufruf führt als alle Komprimierungsfunktionen und '||' -Operatoren aus, aber ansonsten ist das gut. – Joe

+0

Ja, Sie haben Recht. Ich werde den Code entsprechend bearbeiten. – Jetzler

0

Neben Jetzler Antwort, Beachten Sie, dass es je nach Situation einfacher sein kann, die Schleifen in Ihr Makro einzufügen:

%let trans = trans1 trans2 trans3 trans4; 
%let trips = aaa bbb rem vcs; 
%let outs = transout1 transout2 transout3 transout4; 

%macro transform; 

    %do i = 1 %to %sysfunc(countw(&trans.)); 
     %do j = 1 %to %sysfunc(countw(&trips.)); 
      %do k = 1 %to %sysfunc(countw(&outs.)); 

       /*your code here*/ 

      %end; 
     %end; 
    %end; 

%mend transform; 

%transform; 
Verwandte Themen