2017-10-27 4 views
0

Ich möchte ein SAS-Makro verbessern, das einige Variablen durchläuft und Häufigkeitstabellen für sie druckt.SAS-Parameterliste

Hier ist der Arbeits Makro:

%macro iraCatFreq(IRACatsList); 
%local i next; 
%let i=1; 
%do i=1 %to %sysfunc(countw(&IRACatsList)); 
    %let next=%scan(&IRACatsList,&i); 
    proc freq data=out.SCF16_Cath; 
    weight WGT; 
    by ANYPEN; 
    tables &next; 
    format rRothContrBin allBinaries_format.; 
    run; 
%end; 
%mend iraCatFreq; 
%iraCatFrew(rRothContrBin sRothContrBin oRothContrBin rRegContrBin sRegContrBin oRegContrBin); 

ich dieses Makro durch Ersetzen der Parameterliste von Variablennamen (rRothContrBin sRothContrBin oRothContrBin rRegContrBin sRegContrBin oRegContrBin) mit einem einzigen Parameter verbessern wollte.

Hier ist der Ansatz, den ich zusammengeschustert:

/*Create a table of variable names for IRA types and owners*/ 

data IRACats; 
    infile datalines; 
    length x $ 17; 
    input x $; 
    datalines; 
rRothContrBin 
sRothContrBin 
oRothContrBin 
rRegContrBin 
sRegContrBin 
oRegContrBin 
    ; 

/*Convert table of strings into a macro variable, &IRACatsList */ 

proc sql noprint; 
    select x into :IRACatsList separated by ' ' 
    from IRACats; 
quit; 
%put IRACatsList = &IRACatsList; 

Ich habe versucht, das Makro ausgeführt wird nach diesem Ansatz laufen,

%iraCatFreq(&IRACatsList); 

Es funktioniert, aber gibt es einen besseren Weg, dies ohne die Daten zu tun und proc sql Schritte?

+1

Gibt es einen Grund, warum Sie nicht nur all diese Variablen zu einer einzigen 'Tabellen setzen 'Aussage innerhalb von proc freq? – user667489

+1

Ich verstehe die Frage nicht. Ihr Makro nimmt bereits einen einzelnen Parameter an, der eine Liste von Werten akzeptiert. Was willst du ändern? – Tom

+0

Uh ... Ich habe es vergessen. – AwfulPersimmon

Antwort

2

Sie können die vorhandene Makro mit einer einzelnen Makrovariable nennen und ohne proc sql oder Daten Schritte wie folgt aus:

%let IRACatsList = rRothContrBin sRothContrBin oRothContrBin rRegContrBin sRegContrBin oRegContrBin; 
%iraCatFreq(&IRACatsList);