我想使用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;
这会在Word中生成一个RTF表,如下所示(稍微简化):
但是,我想在变量名列中的组上方添加一个变量标签'变量1,n(%)'作为单独的行(不在标题行中)。我还想在聚合表中添加其他变量和统计信息。
最后,我想要一些看起来像这样的东西:
我尝试过“一切” - 有谁知道怎么做?
答案 0 :(得分: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;
我发现你的示例代码有点令人困惑; 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
答案 1 :(得分:1)
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;
您可以在PROC REPORT中将varnum和group设置为ORDER变量,并通过COMPUTE BEFORE添加“变量1”或“花式变量2”等标题; LINE
2为了进一步防止PROC REPORT弄乱ODS RTF输出中的布局,请考虑重新启用ASIS样式选项:
define str / "..." style( column ) = { asis= on };