Как создавать красивые таблицы, используя PROC REPORT и ODS RTF выход - PullRequest
6 голосов
/ 25 января 2012

Я хочу создать «красивую таблицу» с использованием вывода SAS ODS RTF и процедуры PROC REPORT.Проведя весь день в Google, мне удалось создать следующее:

Набор данных

DATA survey;
   INPUT id var1 var2 var3 var4 var5 var6 ;
   DATALINES;
 1  1  35 17  7 2 2
17  1  50 14  5 5 3
33  1  45  6  7 2 7
49  1  24 14  7 5 7
65  2  52  9  4 7 7
81  2  44 11  7 7 7
2   2  34 17  6 5 3
18  2  40 14  7 5 2
34  2  47  6  6 5 6
50  2  35 17  5 7 5
;
RUN;

DATA survey;
    SET survey;
    LABEL var1 ='Variable 1';
    LABEL var2 ='Fancy variable 2';
    LABEL var3 ='Another variable no 3';
RUN;

LIBNAME mylib 'C:\my_libs';
RUN;

PROC FORMAT LIBRARY = mylib.survey;
    VALUE groups 1 = 'Group A'
                2 = 'Group B'
    ;

OPTIONS FMTSEARCH = (mylib.survey);

DATA survey;
    SET survey;
    FORMAT var1 groups.;
RUN; 

** Код для создания rtf-файла **

ods listing close;
ods escapechar = '^';
ods noproctitle;

options nodate number;
footnote;

ODS RTF FILE = 'C:\my_workdir\output.rtf' 
author = 'NN'
title = 'Table 1 name'
bodytitle 
startpage = no
style = journal;
options papersize = A4 
orientation = landscape;

title1 /*bold*/ /*italic*/ font = 'Times New Roman'  height = 12pt justify = center underlin = 0 color = black bcolor = white 'Table 1 name';
footnote1 /*bold*/ /*italic*/ font = 'Times New Roman'  height = 9pt justify = center underlin = 0 color = black bcolor = white 'Note: Created on January 2012';

PROC REPORT DATA = survey nowindows headline headskip MISSING
    style(header) = {/*font_weight = bold*/ font_face = 'Times New Roman' font_size = 12pt just = left}
    style(column) = {font_face = 'Times New Roman' font_size = 12pt just = left /*asis = on*/};
    COLUMN var1 var1=var1_n var1=var1_pctn;
    DEFINE var1 / GROUP ORDER=FREQ DESCENDING 'Variable';
    DEFINE var1_n / ANALYSIS N 'Data/(N=)';
    DEFINE var1_pctn / ANALYSIS PCTN format = percent8. '';
RUN;

ODS RTF CLOSE;

Это создает таблицу RTF в Word, что-то вроде следующего (немного упрощенно):

What I get

Однако я хочу добавить переменнуюlable 'Variable 1, n (%)' над группами в столбце имени переменной в виде отдельной строки (НЕ в строке заголовка).Я также хочу добавить дополнительные переменные и статистику в агрегированную таблицу.

В конце я хочу что-то похожее на это:

enter image description here

Я пытался«все» - есть кто-нибудь, кто знает, как это сделать?

Ответы [ 2 ]

5 голосов
/ 16 апреля 2012

Я знаю, что это было открыто некоторое время, но я тоже некоторое время боролся с этим, и это то, что я понял. Итак ...

Короче говоря, в SAS возникают проблемы с выводом красиво отформатированных таблиц, которые содержат в себе более одного типа «формата» таблиц. Например, таблица, где столбцы изменяются на полпути (как вы обычно находите в «Таблице 1» исследования, описывающего исследуемую популяцию).

В этом случае вы пытаетесь использовать PROC REPORT, но я не думаю, что это сработает здесь. Что вы хотите сделать, так это наложить два разных отчета друг на друга. Вы изменяете значение столбца на полпути, и SAS изначально не поддерживает это.

Некоторые альтернативные подходы:

  • Выполните все свои расчеты и аккуратно выведите их в набор данных в SAS в нужных вам положениях. Затем используйте PROC PRINT для их печати. Это то, что я могу описать только как огромное усилие.

  • Создайте новый TAGSET, который позволяет выводить несколько файлов, но удаляет интервал между каждым из них и выравнивает их по одинаковой ширине, эффективно создавая одну таблицу. Это также довольно много времени; Я попытался сделать это, используя HTML с пользовательским CSS-файлом и набором тегов, и это было не очень легко.

  • Используйте другую процедуру (в данном случае, PROC TABULATE), а затем вручную удалите интервал между каждой таблицей и скрипкой с шириной, чтобы получить финальную таблицу. Это не полностью автоматизировано, но, вероятно, это самый быстрый вариант.

PROC TABULATE - это круто, потому что вы можете использовать несколько операторов таблицы в одном примере. Ниже я поместил код, который показывает, о чем я говорю.

DATA survey;
   INPUT id grp var1 var2 var3 var4 var5;
   DATALINES;
     1  1  35 17  7 2 2
    17  1  50 14  5 5 3
    33  1  45  6  7 2 7
    49  1  24 14  7 5 7
    65  2  52  9  4 7 7
    81  2  44 11  7 7 7
    2   2  34 17  6 5 3
    18  2  40 14  7 5 2
    34  2  47  6  6 5 6
    50  2  35 17  5 7 5
;
RUN;

Я нашел ваш пример кода немного запутанным; var1 выглядел как переменная группировки, а var2 выглядел как первая фактическая переменная анализа, поэтому я немного изменил код. Затем я быстро создал тот же формат, который вы использовали раньше.

PROC FORMAT;
    VALUE groupft 1 = 'Group A' 2 = 'Group B';
RUN;

DATA survey;
    SET survey;
    LABEL var1 ='Variable 1';
    LABEL var2 ='Fancy variable 2';
    LABEL var3 ='Another variable no 3';
    FORMAT var1 groupft.;
RUN;

Теперь, суть оператора PROC TABULATE.

PROC TABULATE DATA=survey;
    CLASS grp;
    VAR var1--var5;
    TABLE MEDIAN QRANGE,var1;
    TABLE grp,var2*(N PCTN);
RUN;

TABULATE в основном работает с запятыми и звездочками для разделения вещей. Значением по умолчанию для чего-то вроде grp * var1 является вывод, в котором столбец является первой переменной, а затем для каждой подгруппы имеются подколонки. Чтобы добавить строки, вы используете столбец; чтобы указать, какую статистику вы хотите, вы добавляете ключевое слово.

Приведенный выше код дает вам нечто похожее на то, что было в вашем первом примере (не в формате ODS, но я думаю, вы можете добавить это обратно); это просто в двух разных таблицах.

Я нашел следующие документы полезными, когда решал эту проблему:

http://www.lexjansen.com/pharmasug/2005/applicationsdevelopment/ad16.pdf

http://www2.sas.com/proceedings/sugi31/089-31.pdf

1 голос
/ 26 июля 2013

1 ODS имеет некоторые интересные функции форматирования (например, выравнивание чисел, так что десятичная точка идет в том же столбце), но их полезность ограничена для более сложных случаев.Наиболее гибким решением является создание отформатированной строки самостоятельно и полностью обойти средство форматирования PROC REPORT, например:

data out;
    length str $25;
    set statistics;
    varnum = 1;
    group = 1;
    str = put( median, 3. );
    output;
    group = 2;
    str = put( q1, 3. ) || " - " || put( q3, 3. );
    output;
run;

Вы можете установить varnum и group как переменные ORDER в PROC REPORT и добавить заголовки, такие как «Variable 1»или «Необычная переменная 2» через COMPUTE BEFORE;LINE

2 Чтобы еще больше не мешать PROC REPORT не портить компоновку в выводе RTF ODS, рассмотрите возможность повторного включения опции стиля ASIS:

define str / "..." style( column ) = { asis= on };
...