利用SAS软件制作报表的常用手法

                             如何利用SAS 软件制作报表常用的技巧                                             

1、先设计好你的报表格式

2、用SAS过程先初步得到这些结果
1. 比如可以用means过程、univariate过程得到一些描述统计量;
2. 可以用means过程后面加选项t来做t成组检验,可以用ttest过程来做成组或配对t检验。
而t检验的前途条件要求数据服从正态分布,如果不服从正态分布可以用非参数检验。

3、利用SAS的ODS中ods select选择你所需要的结果
可以先用ods trace来看一下输出的结果都有哪些,然后用ods select选择结果到相应的数据集中。

4、为了直接输出得到上面的表格,可以有两种方法来做。
一种是ODS;一种是利用put在结果输出窗口得到它,再粘贴到word中。

参考代码如下:

/* 该sas 文件旨在说明如何编写一次完成以后不用任何人手更改(包括更改日期、excel的格式等)的常规报表
参考了链接如下:http://bbs.pinggu.org/thread-1444265-1-1.html*/
options noxwait noxsync;
options validvarname=any;

/*该文件为固定报表模板,可以事先调整好单元格格式、字体颜色等*/
x  '"C:\Users\Administrator\Desktop\报表模板.xlsx"';

/*设置各类时间,如test2012-05-16,就是用当天的时间、
sas程序运行的时间去得到这个"2012-05-16";另外一种是你要生成的excel文件是包含时间的,也在这里处理得出 */
data _null_;
x = put(date()-1,yymmdd10.);  /* 比如每日运行这个程序,处理前一日的文件,就是用date()-1 */
y =substr(x,6,2) || substr(x,9,2)||"b";
z =compress(input(substr(x,6,2),best8.)||"."||input(substr(x,9,2),best8.));
call symput('y',y);
call symput('z',z);
run;
%let log=alla_&path;        /* 我要处理的文件名就是 alla_0516b 这种形式 */

libname result "D:\test";
data temp1(compress=yes);
set result.&log;            /* 类似这样应用 */
run;

/* 中间是你数据处理的过程,省略 */

filename r1 dde 'excel|[报表模板.xlsx]自定义表名1!r5c1:r60c6' ;  /* 对某张表某些单元格进行写入 */
data _null_;
set result1;
file r1 notab linesize=2000;    /* DDE默认空格为分隔符,如果一个变量中间有空格将会分开到两个单元格,用notab即可避免,
linesize赋予一个足够大的值,则过长的变量不会错行 */
put date '09'x time '09'x source '09'x duration '09'x sql '09'x type;
run;

filename r1 dde 'excel|[报表模板.xlsx]自定义表名2!r5c1:r60c6' ;   /*  继续写入下一张表 */
data _null_;
set result2;
file r1 notab linesize=2000;
put date '09'x time '09'x source '09'x duration'09'x  sql '09'x type;
run;

filename r1 dde "excel|system";  
data _null_;
file r1;
put '[workbook.activate("自定义表名2")]';  /* 激活其中一张表 */
put '[row.height(0,"A1:A1",false,3)]';    /* 调整行高;类似这样的跟vba比较像 */
put '[workbook.activate("自定义表名1")]';
put '[row.height(0,"A1:A1",false,3)]';
x= compress('[save.as("D:\sql('||&path2||').xlsx")]');  /* 存储一个备份到某个路径,文件名为 sql(5.16).xlsx  */
put x;
y= compress('[save.as("E:\MailFile\sql('||&path2||').xlsx")]');  /* 存储到邮件文件夹,这样由邮件自动发送excel出去 */
put y;
put '[quit]';
run;

/*整个程序如上,然后txt写如下内容另存为bat文件,在windows-附件-系统工具-任务计划程序里面设置每日凌晨运行这个bat即可:
D:
cd: "D:\sas_program\sas\sasfoundation\9.2\"
sas.exe -sysin "D:\thisprogramname.sas" -altlog "D:\test\log.log"
*/
/* 上述bat第二行是你sas程序的路径,第三行表示执行的sas程序的路径和名字,然后将sas运行的日志写入到log.log中,
以便事后查看日志 */

/*========================================================SAS 报表设计案例=====================================*/
/*四格表指标统计分析报表sas宏程序*/
%macro chisq (database= ,var= ,varfmt=,index=) ;
proc freq data = &database. noprint ;
tables &var. * group /out = TabFreq ;
run ;
data ma ( where = (group ="A") ) mb ( where= (group ="B") ) ;
set TabFreq (keep = &var. group COUNT) ;
where &var. = . ;
run ;
ods listing close ;
ods output CrossTabFreqs = CrossTabFreqs chisq = chisqFishersExact=FishersExact ;
proc freq data = &database. ;
tables &var. * group /chisq exact expectednopercent norow ;
run ;
ods listing ;
proc sort out = EXPECTED(keep = EXPECTED)
data = CrossTabFreqs ( where = ( EXPECTED not=. ) ) ;
by Expected ;
run ;
data T(keep = T) ;
set EXPECTED ;
if n = 1 then T = EXPECTED ;
if T = . then delete ;
run ;
proc sort out = Frequency ( keep = Frequency)
data = CrossTabFreqs ;
by descending Frequency ;
run ;
data n (keep = n) ;
set Frequency ;
if n = 1 then n = Frequency ;
if n = . then delete ;run ;
run ;
data chisq1 (keep =value1 Prob1 ) ;
set chisq ( rename = (value = value1 Prob =Prob1) ) ;
where (Statistic = ('Chi-Square') | Statistic = ('卡方') ) ;
run ;
data chisq2 (keep =value2 Prob2 ) ;
set chisq ( rename = (value = value2 Prob =Prob2) ) ;
where ( Statistic = ( 'Continuity Adj. Chi-Square') | Statistic =('连续校正卡方') ) ;
run ;
data Fishersexact (keep = cvalue1) ;
set Fishersexact ;
where (Name1 = ('XP2_FISH') ) ;
run ;
data st (keep = ma mb n T value1 Prob1 value2 Prob2 cvalue1&var. c) ;
merge ma ( rename = (COUNT = ma) ) mb ( rename = (COUNT = mb) ) n Tchisq1 chisq2 Fishersexact ;
&var. = - 99 ;
if ma = . then ma = 0 ;
if mb = . then mb = 0 ;
format value1 6.2 value2 6.2 ;
run ;
data outa ( where = ( group ="A") ) outb (where = (group ="B") );
set CrossTabFreqs ;
format ColPercent 6.2 ;
run ;
data outt (drop = table group _TYPE_ _TABLE_ Expected Missing);
merge outa (rename = ( Frequency = A ColPercent = percentA) )
outb ( rename = ( Frequency = B ColPercent =percentB) ) ;
if &var. = . then &var. = - 99;
run ;
proc sort ;by &var. ;run ;
data _null_ ;
file print notitle ;
merge outt st ;
if &var. = - 99 then do ;
if n = 40 and 1 = 40 and T > = 5 then do ;
put @3"&index. " @70 'chisq = 'value1 @83 'P='Prob1 ;
end ;
put @5 "例数(缺失) " @22 A '(' MA ') ' @47 B '(' MB ') ';
end ;
else do ;
put @5 &var. '(%) ' @22 A '(' PercentA ') '@47 B'('PercentB ') ';
format &var. &varfmt..;
end ;
run ;
proc datasets;
delete chisq chisq1 chisq2 Crosstabfreqs ExpectedFishersexact
Frequency Ma Mb N Outa Outb Outt st stt t Tabfreq ; quit ;
%mend chisq ;
data jixian;
input id group$ SEX;
datalines;
1 A 1
2 A 2
3 A 2
4 A 2
5 B 1
6 B 2
7 B 1
8 B 2
;
run;
proc format;
value sexfmt 1='男性' 2='女性';
run;
%chisq (database=jixian ,var=sex ,varfmt=sexfmt,index=性别)

其出来的结果如下:


  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值