2016-02-10 2 views
4

Вместо выполнения нескольких отдельных процедур PROC FREQ в очень большом наборе данных я хотел бы повысить эффективность за счет выполнения одного PROC FREQ с несколькими операциями TABLE. Для нашего процесса QA требуются заголовки таблиц, которые просты с одним оператором TABLE, используя один оператор TITLE, но возможно ли это с несколькими операциями TABLE?SAS: Отдельные названия таблиц для PROC FREQ или PROC REPORT?

Возьмем в качестве примера данные и код ниже:

DATA TEST; 
    INPUT TEMPERATURE HUMIDITY PLATE FORM $12.; 
    DATALINES; 
    25 75 1 HOT 
    30 75 2 COLD 
    25 45 3 HOT 
    30 45 4 COLD 
    25 55 5 HOT 
    30 55 6 COLD 
    25 15 7 HOT 
    30 15 8 COLD 
    ; 
RUN; 

** SINGLE PASS ON PROC FREQ **; 
PROC FREQ DATA = TEST; 
    TITLE1 "TEMPERATURE FREQS"; 
     TABLE TEMPERATURE/LIST OUT=FREQS_TEMP; 
    TITLE2 "HUMIDITY FREQS"; 
     TABLE HUMIDITY/LIST OUT=FREQS_HUM; 
    TITLE3 "PLATE FREQS"; 
     TABLE PLATE/LIST OUT=FREQS_PLATE; 
    TITLE4 "FORM FREQS"; 
     TABLE FORM/LIST OUT=FREQS_FORM; 
RUN;TITLE1;TITLE2;TITLE3;TITLE4; 

Названия стек поверх друг друга на самом верху таблицы, а не каждой таблицы, так что-то подобное можно на этапе обработки данных или необходимо создать настраиваемый шаблон? Может ли PROC REPORT быть более жизнеспособным вариантом для пользовательских частот?

ответ

3

Один из вариантов, который немного работает, но может стоить того, если набор данных очень велик, заключается в использовании proc document. Я полагаю, что это примерно такое же количество работы, что и в выводе частот в отдельные таблицы, а затем выполнение отчета или частоту по этим отдельно и немного менее беспорядочно.

PROC DOCUMENT позволяет редактировать выходной объект, а затем воспроизводить его. В вашем случае то, что вам не хватает в freq, это разрывы страниц между таблицами - SAS только помещает title в заголовок страницы, поэтому вы не получите его между таблицами. Я думаю, что PROC FREQ также не создает никаких таблиц до run, поэтому первые три утверждения заголовка ничего не делают (ваши делают только потому, что вы используете titel1/2/3/4 - если вы использовали title каждый раз, только четвертый вступит в силу).

Вам нужно сначала добавить разрывы страниц, а затем добавить заголовки (вы, к сожалению, не сохраните их из PROC FREQ, чтобы вы могли их исключить). Итак:

*ODS DOCUMENT creates the DOCUMENT object you will later modify; 
ods document name=freqs(write); 
** SINGLE PASS ON PROC FREQ **; 
PROC FREQ DATA = TEST; 
    TITLE "TEMPERATURE FREQS"; 
     TABLE TEMPERATURE/LIST OUT=FREQS_TEMP; 
    TITLE "HUMIDITY FREQS"; 
     TABLE HUMIDITY/LIST OUT=FREQS_HUM; 
    TITLE "PLATE FREQS"; 
     TABLE PLATE/LIST OUT=FREQS_PLATE; 
    TITLE "FORM FREQS"; 
     TABLE FORM/LIST OUT=FREQS_FORM; 
RUN; 
title; 
ods document close; 


*PROC DOCUMENT is an interactive proc, so it stays active until QUIT; 
proc document name=freqs; 
    *Just a look at what it looks like under the hood - can be removed in production; 
    list/levels=all; 
run; 

    *Here we create page breaks (OBPAGE command) after each table.; 
    obpage \Freq#1\Table1#1\OneWayFreqs#1 /after; 
    obpage \Freq#1\Table2#1\OneWayFreqs#1 /after; 
    obpage \Freq#1\Table3#1\OneWayFreqs#1 /after; 


    *Here we add the titles.; 
    obtitle \Freq#1\Table1#1\OneWayFreqs#1 "TEMPERATURE FREQS"; 
    obtitle \Freq#1\Table2#1\OneWayFreqs#1 "HUMIDITY FREQS"; 
    obtitle \Freq#1\Table3#1\OneWayFreqs#1 "PLATE FREQS"; 
    obtitle \Freq#1\Table4#1\OneWayFreqs#1 "FORM FREQS"; 

    *And here we replay the document with the changes; 
    replay ^; 
run; 

quit; 
-1

В этом случае я предлагаю маршрут макроса. Вероятно, экономит и код в долгосрочной перспективе. Создайте макрос со своим PROC FREQ и вызовите его несколько раз.

%macro freq_out(VName, VSub); 

proc freq data=test; 
title "&VName Freqs"; 
table &vname/list out=freqs_&vsub; 
run; 

%mend; 

%freq_out(Temperature, Temp); 
%freq_out(Humidity, Hum); 
+1

Я считаю, что точка запроса Фоксера заключается в том, чтобы избежать нескольких проходов данных. –

+0

Вы правы, @data_null_. Я пытаюсь избежать макроса и 'FREQ' с тем же большим набором данных несколько раз. – Foxer

+0

Не было бы быстрее использовать хэш-решение и получить данные для печати/отображения? – Reeza

Смежные вопросы