PROC REPORT基础
1 PROC REPORT语法
PROC REPORT data= SAS-data-set options ;
COLUMNS variable_1 …. variable_n;
DEFINE variable_1;
DEFINE variable_2;
. . .
DEFINE variable_n;
COMPUTE blocks
BREAK … ;
RBREAK … ;
RUN;
COLUMNS:指定输出到报表的列
DEFINE:上述列的格式等
COMPUTE:计算模块
BREAK / RBREAK:生成合计,或报表其它类型的格式。
PROC REPORT的选项Options有很多,下面介绍几个常用的:
DATA= 指定做报表的数据集
PROMPT= PROMPT模式
NOWINDOWS= 不输出到结果
REPORT = 指定一个存储的报表来生成新报表
OUTREPT= 指定新路径来存放报表
OUT= 建立新数据集
HEADLINE 在报表变量标题和内容间生成一个水平分隔线
HEADSKIP 在报表变量标题和内容间生成一行空格
2 先生成一个基本的报表
先生成数据:
data mnthly_sales;
length zip $ 5 cty $ 8 var $ 10;
input zip $ cty $ var $ sales;
label zip="Zip Code"
cty="County"
var="Variety"
sales="Monthly Sales";
datalines;
52423 Scott Merlot 186.
52423 Scott Chardonnay 156.61
52423 Scott Zinfandel 35.5
52423 Scott Merlot 55.3
52388 Scott Merlot 122.89
52388 Scott Chardonnay 78.22
52388 Scott Zinfandel 15.4
52200 Adams Merlot 385.51
52200 Adams Chardonnay 246
52200 Adams Zinfandel 151.1
52200 Adams Chardonnay 76.24
52199 Adams Merlot 233.03
52199 Adams Chardonnay 185.22
52199 Adams Zinfandel 95.84
;
run;
Proc Report生成最基本的报表:
proc report data=mnthly_sales
headline headskip ;
title1 "Simple Report";
column cty zip var sales;
define cty / display width=6 'County/Name';
define zip / display;
define var / display;
define sales / display format=6.2 width=10;
run;
这里的define后面的’/’,其后面有很多选项来对变量格式,输出方式等进行设置,其选项如下:
GROUP:分组显示
DISPLAY:一般显示
ANALYSIS:其值用于计算或统计
ORDER:按其值排序显示
ACROSS:交叉显示
COMPUTED:其值在compute块里计算得到
结果:
3 使用order,按指定变量名排序显示
proc report data=mnthly_sales
headline headskip ;
title1 "Simple Report";
column cty zip var sales;
define cty / order width=6 'County/Name';
define zip / display;
define var / display;
define sales / display format=6.2 width=10;
run;
结果:
4 group分组显示
proc report data=mnthly_sales nofs
headline headskip ;
title1 "Simple Report";
column cty zip var sales;
define cty / group width=6 'County/Name';
define zip / group;
define var / group order=freq descending;
define sales / display format=6.2 width=10;
run;
结果:
5 analysis,统计量求和
proc report data=mnthly_sales nofs
headline headskip ;
title1 "Simple Report";
column cty zip sales;
define cty / group width=6 'County/Name';
define zip / group;
define sales / analysis sum format=6.2 width=10;
run;
结果:
6 求多个统计量
proc report data=mnthly_sales nofs
headline headskip ;
title1 "Simple Report";
column cty zip sales sales=mean_sales;
define cty / group width=6 'County/Name';
define zip / group;
define sales / analysis sum format=6.2 width=10 'sum';
define mean_sales / analysis mean format=6.2 width=10 'Mean of/Sales';
run;
结果:
7 如果你想让某变量的每一个值都作为一列,那就要用到across。这里要注意的是,有across选项的var,在column时后面加了一个’,’,从而将其后面的变量的数据直接放到across变量下。。
proc report data=mnthly_sales nofs headline headskip;
title1 "Cross Tab Report (Across Type)";
column cty zip var,sales;
define cty / group width=6 'County/Name';
define zip / group;
define var / across order=freq descending '- Grape Variety -';
define sales / analysis sum format=6.2 width=10 'Revenue';
run;
结果:
这里,变量variety的每一个值都成为了新的列
8 BREAK与RBREAK,对分组后的报表汇总
proc report data=mnthly_sales nofs headline headskip;
title1 "Report with Breaks";
column cty zip var,sales;
define cty / group width=6 'County/Name';
define zip / group;
define var / across order=freq descending '- Grape Variety -';
define sales / analysis sum format=6.2 width=10 'Revenue';
break after cty / ol skip summarize suppress;
rbreak after / dol skip summarize;
run;
结果:
这里说明一下BREAK与RBREAK后面的选项:
OL 汇总上方加一条线
DOL汇总上方加两条线
UL汇总下方加一条线
DUL 汇总下方加两条线
summarize 对每组进行汇总
skip 加入一空白行
suppress 在汇总行不显示组名
9 compute块,计算统计变量,这个以后将专门介绍
proc report data=mnthly_sales nofs headline headskip;
title1 "Report with Row Sums (Computed Type)";
column cty zip var,sales row_sum;
define cty / group width=6 'County/Name';
define zip / group;
define var / across order=freq descending '- Grape Variety -';
define sales / analysis sum format=6.2 width=10 'Revenue';
define row_sum / computed format=comma10.2 'Total';
break after cty / ol skip summarize suppress;
rbreak after / dol skip summarize;
compute row_sum;
row_sum = sum(_C3_,_C4_,_C5_,_C6_,_C7_,_C8_);
endcompute;
run;
结果:
Compute块是以compute开始,endcompute为结尾,可以计算出很多复杂的数据。这里的_C*_表示第几列的变量,例如_C3_表示第三列,_C#_代表最后一行。这里的_C7_和_C8_是多余的,但不影响结果。
10 proc report与ODS,以后会详细介绍。这里用ODS输出report过程结果,方法很简单,就是将上面的report代码放入ods语句之间。
ods listing close;
ods rtf file = ‘c:sugi30.rtf’;
上面的proc report过程代码放在这里就行
ods rtf close;
即:
ods listing close;
ods rtf file = 'c:sugi30.rtf';
proc report data=mnthly_sales nofs headline headskip;
title1 "Report with Row Sums (Computed Type)";
column cty zip var,sales row_sum;
define cty / group width=6 'County/Name';
define zip / group;
define var / across order=freq descending '- Grape Variety -';
define sales / analysis sum format=6.2 width=10 'Revenue';
define row_sum / computed format=comma10.2 'Total';
break after cty / ol skip summarize suppress;
rbreak after / dol skip summarize;
compute row_sum;
row_sum = sum(_C3_,_C4_,_C5_,_C6_,_C7_,_C8_);
endcompute;
run;
ods rtf close;
结果:
11 report设置style,让报表更炫一点。这个以后也会详细介绍
ods listing close;
ods rtf file = 'c:sugi30.rtf';
proc report data=mnthly_sales nofs headline headskip
style(header)={background=lightskyblue foreground=black}
style(column)={background=lightcyan foreground=black};
title1 "Report with Row Sums (Computed Type)";
column cty zip var,sales row_sum;
define cty / group width=6 'County/Name';
define zip / group;
define var / across order=freq descending '- Grape Variety -';
define sales / analysis sum format=6.2 width=10 'Revenue';
define row_sum / computed format=comma10.2 'Total';
break after cty / ol skip summarize suppress;
rbreak after / dol skip summarize;
compute row_sum;
row_sum = sum(_C3_,_C4_,_C5_,_C6_,_C7_,_C8_);
endcompute;
run;
ods rtf close;
结果:
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在当今这个数据驱动的时代,几乎每一个业务决策都离不开对数据的深入分析。而其中,指标波动归因分析更是至关重要的一环。无论是 ...
2025-02-18当数据开始说谎:那些年我们交过的学费 你有没有经历过这样的场景?熬了三个通宵做的数据分析报告,在会议上被老板一句"这数据靠 ...
2025-02-17数据分析作为一门跨学科领域,融合了统计学、编程、业务理解和可视化技术。无论是初学者还是有一定经验的从业者,系统化的学习路 ...
2025-02-17挖掘用户价值本质是让企业从‘赚今天的钱’升级为‘赚未来的钱’,同时让用户从‘被推销’变为‘被满足’。询问deepseek关于挖 ...
2025-02-17近来deepseek爆火,看看deepseek能否帮我们快速实现数据看板实时更新。 可以看出这对不知道怎么动手的小白来说是相当友好的, ...
2025-02-14一秒精通 Deepseek,不用找教程,不用买资料,更不用报一堆垃圾课程,所有这么去做的,都是舍近求远,因为你忽略了 deepseek 的 ...
2025-02-12自学 Python 的关键在于高效规划 + 实践驱动。以下是一份适合零基础快速入门的自学路径,结合资源推荐和实用技巧: 一、快速入 ...
2025-02-12“我们的利润率上升了,但销售额却没变,这是为什么?” “某个业务的市场份额在下滑,到底是什么原因?” “公司整体业绩 ...
2025-02-08活动介绍 为了助力大家在数据分析领域不断精进技能,我们特别举办本期打卡活动。在这里,你可以充分利用碎片化时间在线学习,让 ...
2025-02-071、闺女,醒醒,媒人把相亲的带来了。 我。。。。。。。 2、前年春节相亲相了40个, 去年春节相亲50个, 祖宗,今年你想相多少个 ...
2025-02-06在数据科学的广阔领域中,统计分析与数据挖掘占据了重要位置。尽管它们常常被视为有关联的领域,但两者在理论基础、目标、方法及 ...
2025-02-05在数据分析的世界里,“对比”是一种简单且有效的方法。这就像两个女孩子穿同一款式的衣服,效果不一样。 很多人都听过“货比三 ...
2025-02-05当我们只有非常少量的已标记数据,同时有大量未标记数据点时,可以使用半监督学习算法来处理。在sklearn中,基于图算法的半监督 ...
2025-02-05考虑一种棘手的情况:训练数据中大部分样本没有标签。此时,我们可以考虑使用半监督学习方法来处理。半监督学习能够利用这些额 ...
2025-02-04一、数学函数 1、取整 =INT(数字) 2、求余数 =MOD(除数,被除数) 3、四舍五入 =ROUND(数字,保留小数位数) 4、取绝对值 =AB ...
2025-02-03作者:CDA持证人 余治国 一般各平台出薪资报告,都会哀嚎遍野。举个例子,去年某招聘平台发布《中国女性职场现状调查报告》, ...
2025-02-02真正的数据分析大神是什么样的呢?有人认为他们能轻松驾驭各种分析工具,能够从海量数据中找到潜在关联,或者一眼识别报告中的数 ...
2025-02-01现今社会,“转行”似乎成无数职场人无法回避的话题。但行业就像座围城:外行人看光鲜,内行人看心酸。数据分析这个行业,近几年 ...
2025-01-31本人基本情况: 学校及专业:厦门大学经济学院应用统计 实习经历:快手数据分析、字节数据分析、百度数据分析 Offer情况:北京 ...
2025-01-3001专家简介 徐杨老师,CDA数据科学研究院教研副总监,主要负责CDA认证项目以及机器学习/人工智能类课程的研发与授课,负责过中 ...
2025-01-29