如何使用PROC REPORT和ODS RTF输出创建漂亮的表

Gor*_*don 6 sas

我想使用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; 
Run Code Online (Sandbox Code Playgroud)

**创建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;
Run Code Online (Sandbox Code Playgroud)

这会在Word中生成一个RTF表,如下所示(稍微简化):

我得到了什么

但是,我想在变量名列中的组上方添加一个变量标签'变量1,n(%)' 作为单独的行(不在标题行中).我还想在聚合表中添加其他变量和统计信息.

最后,我想要一些看起来像这样的东西:

在此输入图像描述

我尝试了"一切" - 是否有人知道如何做到这一点?

TAR*_*man 5

我知道这已经开放了一段时间,但我也在努力解决这个问题,这就是我想到的.所以...

简而言之,SAS无法输出格式良好的表,其中包含多种类型的表"格式".例如,列中间的列发生变化(就像您在描述研究人群的研究报告的"表1"中常见的那样).

在这种情况下,您尝试使用PROC REPORT,但我认为它不会在这里工作.你想要做的是真正地将两个不同的报告叠加在一起.您正在中途更改列值,SAS本身不支持该值.

一些替代方法是:

  • 执行所有计算并小心地将它们输出到SAS中的数据集,位于所需的位置.然后,使用PROC PRINT打印它们.这是我只能说是一项巨大的努力.

  • 创建一个新的TAGSET,允许您输出多个文件,但删除每个文件之间的间距并将它们对齐到相同的宽度,从而有效地创建一个表.这也非常耗时; 我尝试使用带有自定义CSS文件和标记集的HTML,这并不容易.

  • 使用不同的过程(在本例中为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;
Run Code Online (Sandbox Code Playgroud)

我发现你的示例代码有点令人困惑; 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;
Run Code Online (Sandbox Code Playgroud)

现在,PROC TABULATE声明的内容.

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

TABULATE基本上使用逗号和星号来分隔事物.像grp*var1这样的默认值是一个输出,其中列是第一个变量,然后每个子组都有子列.要添加行,请使用列; 要指定所需的统计信息,请添加关键字.

上面的代码让你接近你在第一个例子中所拥有的东西(不是ODS格式,但我想你可以添加它); 它只是在两个不同的表格中.

我在解决这个问题时发现以下文章很有用:

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

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