本系列连载文章:
- 七天搞定SAS(七):常用统计模型
- 七天搞定SAS(六):宏的编写、程序调错
- 七天搞定SAS(五):数据操作与合并
- 七天搞定SAS(四):数据输出
- 七天搞定SAS(三):基本模块调用(格式、计数、概要统计、排序等)
- 七天搞定SAS(二):基本操作(判断、运算、基本函数)
- 七天搞定SAS(一):数据的导入、数据结构
弄清楚了基本的PROC之后,开始研究SAS的输出...毕竟有了数据处理的结果之后,还要有一个比较舒服的输出格式才可以嘛。
SAS的结果发送系统:ODS
SAS里面的输出叫的比较好听: Output Delivery System (ODS),结果发送系统。也就是说,要不停的开始研究ODS这个东西了。输出的方向包括:
- LISTING:标准SAS输出
- HTML: HTML网页输出
- RTF: 富文本格式
- PRINTER:高分辨率打印
- PS: ps矢量格式
- PCL: 打印机操纵语言
- PDF:PDF格式
- OUTPUT: SAS数据表格
- MARKUP:XML、excel、csv、latex等格式
- DOCUMENT:输出文档
基本满足要求了?当然,SAS还有模板可以选,还有追踪和选择...不着急,我们一个个来研究。
模板的话,需要调用PROC TEMPLATE:
PROC TEMPLATE; LIST STYLES; RUN;
自带了若干模板:
ANALYSIS D3D MINIMAL SASWEB BARETTSBLUE DEFAULT PRINTER SANSPRINTER BRICK JOURNAL RTF STATISTICAL
然后TRACE会在日志文件里面跟踪输出的对象:
DATA giant; INFILE 'c:\MyRawData\Tomatoes.dat' DSD; INPUT Name :$15. Color $ Days Weight; * Trace PROC MEANS; ODS TRACE ON; PROC MEANS DATA = giant; BY Color; RUN; ODS TRACE OFF;
这样就有日志中的记录:
Output Added: ------------- Name: Summary Label: Summary statistics Template: base.summary Path: Means.ByGroup1.Summary ------------- NOTE: The above message was for the following by-group: Color=red Output Added: ------------- Name: Summary Label: Summary statistics Template: base.summary Path: Means.ByGroup2.Summary ------------- NOTE: The above message was for the following by-group: Color=yellow
最后,还可以选择ODS输出的对象:
PROC MEANS DATA = giant; BY Color; TITLE 'Red Tomatoes'; ODS SELECT Means.ByGroup1.Summary; RUN;
这样就只有第一组的统计数据了。
SAS中建立输出数据表:OUTPUT
很多时候我们希望直接把结果放在另外一个SAS的数据表中,这样就需要OUTPUT声明了。
DATA giant; INFILE 'c:\MyRawData\Tomatoes.dat' DSD; INPUT Name :$15. Color $ Days Weight; PROC TABULATE DATA = giant; CLASS Color; VAR Days Weight; TABLE Color ALL, (Days Weight) * MEAN; TITLE 'Standard TABULATE Output'; ODS OUTPUT Table = tabout; RUN; PROC PRINT DATA = tabout; TITLE 'OUTPUT SAS Data Set from TABULATE'; RUN;
很显然,对于下面那个SAS表格的输出,我们可以像操纵普通表格一样来操纵它,各种方便省事对吧?毕竟有的时候SAS给我们的并不是我们想要的最终结果,还要各种小小加工一番才好。
SAS的输出:HTML
有的时候HTML格式的报告会更加方便传播,或者放在服务器上、自动定期更新什么的,便于大家远程直接查看。代码其实也不麻烦:
* Create the HTML files and remove procedure name; ODS HTML FILE = 'c:\MyHTMLFiles\Marine.html'; ODS NOPROCTITLE; DATA marine; INFILE 'c:\MyRawData\Sealife.dat'; INPUT Name $ Family $ Length @@; RUN; PROC MEANS DATA = marine MEAN MIN MAX; CLASS Family; TITLE 'Whales and Sharks'; RUN; PROC PRINT DATA = marine; RUN; * Close the HTML files; ODS HTML CLOSE;
SAS输出富文本:RTF
RTF是一种可以直接被WORD等office软件读取的格式,支持图文表格混排什么的。有的时候直接输出出来也会各种方便(吐槽:相比于R的knitr直接各种文件格式混搭、数据随处可以插入,SAS还是有很长的一段路要走哇)。
* Create an RTF file; ODS RTF FILE = 'c:\MyRTFFiles\Marine.rtf' BODYTITLE COLUMNS=2; ODS NOPROCTITLE; DATA marine; INFILE 'c:\MyRawData\Sealife.dat'; INPUT Name $ Family $ Length @@; RUN; PROC MEANS DATA = marine MEAN MIN MAX; CLASS Family; TITLE 'Whales and Sharks'; RUN; PROC PRINT DATA = marine; RUN; * Close the RTF file; ODS RTF CLOSE;
输出的文档大概长成这样:
勉强可以看看吧。SAS的默认配色真心丑陋,像上世纪win 98时代的...
SAS的输出样式自定义
对于PRINTER输出和REPORT、TABULATE加STYLE选项,就不赘述了,目测不会有用到的需求——一般SAS都不会给我最终拿去给partner或者boss汇报的格式,再者就算SAS里面能做,也实在是太麻烦了,成本太高。我的观点就是,做统计的软件还是做统计吧,那些花里胡哨的修饰还是交给excel这种所见即所得的软件来搞定吧。各有所长才是~
不过SAS有个高亮单元格的功能,可以简单说一下。
ODS HTML FILE='c:MyHTMLmens2.html'; PROC FORMAT; VALUE rec 0 -< 378.72 ='red' 378.72 -< 382.20 = 'orange' 382.20 - HIGH = 'white'; RUN; PROC PRINT DATA=results; ID Place; VAR Name Country; VAR Time/STYLE={BACKGROUND=rec.}; TITLE 'Men''s 5000m Speed Skating'; TITLE2 '2002 Olympic Results'; RUN; ODS HTML CLOSE;
勉强可以一看吧。EXCEL的条件格式(conditional formatting)更顺手强大。
SAS的导出模块:EXPORT
如果说ODS是结果的发送,那么export则是更加原始的数据输出(数据而不一定是分析结果)、供其他软件读取。
SAS图形界面下有一步步向导式的export,但是可惜我悲催的一开始就要接触命令行下面的SAS...跳过。
EXPORT可以输出文本格式,最常用的就是逗号或者tab分割的。
LIBNAME travel ’c:\MySASLib’; * Create Tab-delimited file; PROC EXPORT DATA = travel.golf OUTFILE = 'c:\MyRawData\Golf.txt' REPLACE; RUN;
这里就输出了一个tab分割的文本文件。
当然也可以输出excel文件:
LIBNAME travel 'c:\MySASLib'; * Create Microsoft Excel file'; PROC EXPORT DATA=travel.golf OUTFILE = 'c:\MyExcel\Golf.xls' REPLACE; RUN;
这个和ODS有点重复了呢。不过R也是啊,有各种各样输出的方式,任君选取。