2017-12-22 20 views
0

Ich habe keine anderen Analysten in meinem Team bei der Arbeit und habe eine Frage über die effizienteste Möglichkeit, mehrere proc freq gleichzeitig zu laufen.SAS: formatieren mehrere proc freq mit Makros

Mein Ziel ist es, etwa 160 verschiedene Frequenzen zu laufen und Formatierung für alle von ihnen zu enthalten. Ich nehme an, ein Makro ist der schnellste Weg, aber ich habe nur Erfahrung mit grundlegenden Makros. Unten ist mein Denkprozess wurde die Daten unter der Annahme bereits formatiert:

%macro survey(question, formatA formatB); 
proc freq; 
table &question; 
format &formatA &formatB; 
%mend; 

%survey (question, formatA, formatB); 

„Frage“, „Formata“ und „formatB“ werden zum Beispiel Strings von Daten sein:

- „Frage“ wäre KCI_1 KCI_2 durch KCI_80 - "FormatA" wäre KCI_1fmt KCI_2fmt durch KCI_80fmt - "FormatB" wäre KCI_1fmt. KCI_2fmt. durch KCI_80fmt.

+0

Sie könnten einfach die Anweisungen TABLES und FORMAT direkt eingeben. Wie würde ein Makro helfen? – Tom

+0

Das hängt wirklich davon ab, was Sie mit der Freq tun. Einfach auf den Bildschirm stellen? Einen Datensatz erstellen? Was? – Joe

Antwort

0

Danielle:

können Sie Makro verwenden, um bekannte Formate zu Variablen zuweisen, die nicht bereits formatiert sind. Der Rest der FREQ muss nicht macroisiert werden.

* make some survey data with unformatted responses; 

data have; 
    do respondent_id = 1 to 10000; 
    array responses KCI_1-KCI_80; 
    do _n_ = 1 to dim(responses); 
     responses(_n_) = ceil(4*ranuni(123)); 
    end; 
    output; 
    end; 
run; 

* make some format data for each question; 

data responseMeanings; 
    length questionID 8 responseValue 8 responseMeaning $50; 
    do questionID = 1 to 80; 
    fmtname = cats('Q',questionID,'_fmt'); 
    peg = ranuni (1234); drop peg; 
    do responseValue = 1 to 4; 
     select; 
     when (peg < 0.4) responseMeaning = scan('Never,Seldom,Often,Always', responseValue); 
     when (peg < 0.8) responseMeaning = scan('Yes,No,Don''t Ask,Don''t Tell', responseValue); 
     otherwise responseMeaning = scan('Nasty,Sour,Sweet,Tasty', responseValue); 
     end; 
     output; 
    end; 
    end; 
run; 

* create a custom format for the responses of each question; 

proc format cntlin=responseMeanings(rename=(responseValue=start responseMeaning=label)); 
run; 

* macro to associate variables with the corresponding custom format; 

%macro format_each_response; 
    %local i; 
    format 
    %do i = 1 %to 80; 
    KCI_&i Q&i._fmt. 
    %end; 
    ; 
%mend; 

* compute frequency counts; 

proc freq data=have; 
    table KCI_1-KCI_80; 
    %format_each_response; 
run;