通过TABULATE过程制作汇总报表
制作基本汇总报表
TABULATE过程的基本语法如下:
PROC TABULATE DATA=数据集 <选项>;
CLASS 变量1 <变量2变量3 …>;
VAR变量4 <变量5变量6 …>;
TABLE <<页表达式,> 行表达式,> 列表达式</选项>;
RUN;
其中:
- ·CLASS语句中的变量称为分类变量,依据分类变量的不同取值可以将数据集中的观测划分为不同的分组类别。针对这些分组类别,PROC TABULATE分别计算分析变量(后面会讲到)的统计量。数值型和字符型的变量都可以作为分类变量,但通常类别(分类变量的取值个 数)不宜太多。
- ·VAR语句中的变量称为分析变量,这些变量的值就是进行分析计算的对象。只有数值型变量才可以作为分析变量。为了使汇总报表有意 义,通常要求分析变量的求和或平均等计算是有实际含义的。
- ·TABLE语句是用来定义表格布局的,通过TABLE语句可以定义汇总表格的列、行和页3个维度的布局。在一个TABLE语句中列表达式是 必须的,其余表达式可以省略,但是顺序必须依次是页表达式、行表达 式、列表达式,各表达式中间用逗号(,)分隔。每个维度的表达式由 操作符和元素组成。操作符包括空格操作符和星号(*)操作符,元素 包括分析变量、分类变量、通用的分类变量ALL、统计量、输出格式和标签等。
下面将具体介绍如何使用操作符和元素。 以下程序是使用TABLE语句的简单示例,在定义一个三维的汇总表格后,系统将根据Dept的取值把汇总表格分页,以Emp_Name的取值 作为行,以Amount的取值作为列。
table Dept, Emp_Name, Amount;
一个TABULATE过程中可以有多个CLASS语句、VAR语句和TABLE语句。
- 在TABULATE过程中,任何一个变量都只能是分类变量或分析变量,但不可以既作为分类变量又作为分析变量。
- TABLE语句中出现的任何变量都必须在CLASS语句或者VAR语 句中出现过。
- 所有分析变量必须出现在一个维度(列、行或者页)中,也就 是说,仅有一个维度的表达式中包含分析变量。
在使用TABULATE过程制作报表前,必须根据所要显示的内容明确以下4个问题:
- ·什么变量作为分类变量。
- ·什么变量作为分析变量。
- ·需要计算什么统计量。
- ·用什么样的表格展示结果。
接下来将按照以上的思路结合例子来介绍如何使用TABULATE过程制作报表。
在本节中将使用数据集ex.sales_halfyear作为示例数据,该数据集中含有以下字段:员工工号(Emp_ID)、员工姓名(Emp_Name)、州(State)、销售月份(Month)、销售数量(Sales)、销售价格(Price)、产品类型(Type)、Amount(销售金额)。部分数据如图
使用TABULATE过程制作一个简单表格,显示每个州的交 易次数。
分析:这里的分类变量为State,交易次数是频数统计量,那么分类变量的默认统计量就是频数统计量。以下代码可以实现上述功能:
proc tabulate data=ex.sales_halfyear;
title1 'Sales in North America';
title2 'Trancations in Each State';
class state;
table state;
run;
- ·CLASS语句中定义了一个分类变量state,当TABLE语句使用变量state时,state的每个取值将成为一个分组类别。
- ·如果TABLE语句中只指定了一个表达式state,则这个表达式作为列表达式,state的每个取值将在表格中作为一列。
- ·当没有定义分析变量时,在表格中显示的统计量默认为频数统计 量N。
- ·TITLE语句是全局语句,这里定义两级标题,可以参考PRINT过程 中的介绍。
1.分类变量中含有缺失值
如果分类变量中含有缺失值,在汇总时系统会自动删除分组变量为 缺失值的观测。在PROC TABULATE中使用选项MISSING,可以将缺 失值作为一个特定的类别在报表中显示出来。使用方法如下:
PROC TABULATE DATA=数据集 MISSING;
当选项MISSING使用在PROC TABULATE语句中时,会对所有CLASS语句中的分类变量都起作用。第一次对某个数据集使用 TABULATE过程时,最好能先在PROC TABULATE语句中使用选项 MISSING,这样能对数据集中的各变量是否存在缺失值有比较全面的了 解。
在制作报表过程中,如果只需要将特定变量的缺失值在报表中显 示,可以在CLASS语句中使用选项MISSING。语法如下:
CLASS 变量1 <变量2 … >/MISSING;
这时选项MISSING只对该CLASS语句中的变量起作用,如果 TABULATE过程中还有其他CLASS语句,选项MISSING对其他变量不 起作用。
proc tabulate data=ex.sales_halfyear;
title1 'Sales in North America';
title2 'Trancations in Each State'; class state/missing;
table state;
run;
使用TABULATE过程制作一个简单表格,显示每个州的交易金额。
分析:这里的分类变量是State,分析变量是Amount,使用求和统 计量,在设计表格的时候,可以将State的取值设为行,交易金额的和设 为列,这样就不难写出代码了。代码如下:
proc tabulate data=ex.sales_halfyear;
title1 'Sales in North America';
title2 'Total Amount Sold in Each State';
class state;
var amount;
table state,amount;
run;
在TABLE语句中,分类变量State定义为行维度,State的每个取值 在报表中为一行;分析变量amount定义为列维度,这里没有为amount指定特定的统计量,系统使用默认的SUM统计量。
使用TABULATE过程制作一个简单表格,显示每种产品在每个州的交易金额,并将不同的产品分页展示。
分析:这里的分类变量有两个,分别是State和Type,分析变量是 Amount,使用求和统计量,这里需要使用Type来分页,将State取值设 为行,交易金额的和设为列。示例代码如下:
proc tabulate data=ex.sales_halfyear;
title1 'Sales in North America';
title2 'Total Amount Sold in Each State for Each Type';
class state type;
var amount;
table type,state,amount;
run;
以上汇总表格中每种产品分属不同的页,每页中显示每个州的交易 金额总和,列的名称包含了分析变量Amount和统计量SUM。
2. 制作高级汇总报表
在上面的介绍中,TABLE语句的每个维度都只有一个分类变量或分析变量。事实上,在TABLE语句中可以使用更为复杂的维度表达式来制作汇总报表。
1.使用空格操作符制作连排表格
在TABLE语句的表达式中,使用空格操作符隔开两个元素可以制作连排表格。
使用TABULATE过程制作一个汇总表格,显示每个州的交易数量及每个月的交易数量。
分析:这里的分类变量为State和Month,使用频数统计量,可以考虑制作连排表格。示例代码如下:
proc tabulate data=ex.sales_halfyear;
title1 'Sales in North America';
title2 'Total Transactions';
class state month;
table state month;
run;
在输出结果中,state和month的取值共同构成了汇总表格的列。
2.使用星号(*)操作符制作交叉组合表格
在TABLE语句中,可使用星号(*)操作符隔开两个元素制作交叉组合表格。
使用TABULATE过程制作一个汇总表格,显示每种产品在 每个州的销售金额总和。
分析:分类变量为State和Type,分析变量为Amount,使用求和统 计量。示例代码如下:
proc tabulate data=ex.sales_halfyear;
title1 'Sales in North America';
title2 'Total Amount Sold For Each Type In Each State';
class state type;
var amount;
table type*state,amount;
run;
表达式type*state表示行维度,type在星号(*)操作符的左边,因 此在汇总表格中type位于state的左边。
3.使用关键字ALL
关键字ALL可以使用在TABLE语句的页、行、列表达式中,它可以 作用在一个或者多个分类变量上。ALL可以理解为一个特殊的分组类 别,这个类别中包含所作用变量的所有分组类别内的全部观测。
使用关键字ALL修改例5.15中的程序,显示每种产品在每 个州的销售总和及所有产品在所有州的销售总和。
示例代码如下:
proc tabulate data=ex.sales_halfyear;
title 'Type*State All';
class state type;
var amount;
table type*state all,amount;
run;
proc tabulate data=ex.sales_halfyear;
class state type;
var amount;
title 'Type*(State All)';
table type*(state all),amount;
run;
为了介绍关键字ALL,这里分别制作了两个汇总表格。
- ·左边的表格:关键字ALL作用在type*state之后,ALL相当于和 type*state一样的一个类别,最后一行的类别显示为ALL(全部),表示 计算所有产品在所有州的销售总和。
- ·右边的表格:关键字ALL只作用在state上,相当于是state的一个特殊类别,所以在每个State的所有类别之后,都有一行显示为ALL(全 部),用于计算某种产品在所有州的销售总和。
4.统计量
在上面的例子中,使用的都是系统默认的统计量,其中分类变量的 默认统计量是频数统计量N,分析变量的默认统计量是求和统计量 SUM。除了频数统计量和求和统计量,TABULATE中还可以计算许多 其他统计量。表5.3中是部分较为常见的统计量的关键字。
常见统计量关键字
前面介绍过,在一个TABLE语句中,所有分析变量必须出现在一个维度中,也就是说,只有在一个维度的表达式中才会包含分析变量。同样的,所有的统计量也必须出现在一个维度中,但是分析变量和统计量可以分别出现在不同的维度中。
使用TABULATE过程制作一个汇总表格,显示每种产品在 每个州的交易次数、平均销售金额、销售金额总和。
分析:分类变量为Type和State,分析变量为Amount,统计量为频 数(N)、平均值(MEAN)和求和统计量(SUM)。示例代码如下:
proc tabulate data=ex.sales_halfyear;
title1 'Sales Report in North America';
class state type;
var Amount;
table type*state all,amount*n amount*mean amount;
run;
这里使用了多个统计量N、MEAN和SUM。表达式amount*n amount*mean amount可以使用括号操作符写成amount*(n mean sum)。
3. 改进报表显示
上面已经介绍了TABULATE过程的用法,下面将进一步介绍如何使用其他的语句、选项及关键字,使得输出的报表更为用户化,且具有 可读性。主要包括以下几个方面:
- ·添加标题和脚注
- ·规定变量或统计量标签
- ·控制分类变量输出类别
- ·控制汇总数据的输出格式 在TABULATE过程中,标题和标注的使用方法和在PRINT过程中类似,这里不赘述。
1.规定变量或统计量标签
在使用TABULATE过程制作汇总表格时,若数据集中已经为变量 设立了标签,则在汇总表格中,行或列的表头中将显示其标签而非变量名。如果数据集中的变量没有定义标签,或者在报表中需使用不同于数 据集中已有标签的形式,则可以使用以下两种方法定义变量的标签。
- ·使用LABEL语句定义标签,使用语法和PRINT过程中类似。
- ·在TABLE语句中使用以下语法改写变量名:变量='标签' 其中变量包括通用分类变量ALL。如果不需要某个变量的名称出现 在汇总表格中,则可以将这里的'标签'置为''。
将汇总表格中的变量都使用中文标签显示。 示例代码如下:
proc tabulate data=ex.sales_halfyear;
title1 'Sales Report in North America';
class state type;
var amount;
table type='产品类型'*state all='汇总',amount=''*(n mean sum);
label state='州';
run;
若要对汇总表格中的统计量名称进行更改,类似于变量标签的设 定,可以使用以下两种方法中的任意一种实现。
- ·使用KEYLABEL语句定义标签,相关语法如下:KEYLABEL 统计量关键字1='统计量标签1' 统计量关键字2='统计量标签2';
- ·在TABLE语句中使用以下语法改写变量名:统计量关键字='统计量标签'
将汇总表格中的统计量改为中文名称。 示例代码如下:
proc tabulate data=ex.sales_halfyear;
title1 '北美销售概况';
title2 '产品类型和季度角度分析';
class state type;
var amount;
table type='产品类型'*state all='汇总',amount=''*(n='销售次数' mean='平均销售金额' sum='销售金额之和');
label state='州';
run;
在上述程序中,实现了将统计量N、MEAN及SUM分别用中文标签 显示。
2.使用FORMAT语句控制分类变量的类别
在TABULATE过程中,可以使用FORMAT语句控制分类变量的类 别。使用语法如下:
FORMAT 变量1 <变量2 …> 输出格式1 <变量3 输出格式2…>;
对分类变量使用FORMAT语句后,将按格式化后的值进行分类,同 时,在汇总表格中显示的类别也是变量格式化后的取值。
显示使用TABULATE过程制作一个汇总表格,显示每种产 品每个季度的销售次数、平均销售金额、销售金额总和。
在数据集ex.sales_halfyear中没有季度字段,可以对变量month使用 用户自定义格式$quarter。
示例代码如下:
proc format;
value quarter
-='季度1'
-='季度2'
-='季度3'
-='季度4';
run;
proc tabulate data=ex.sales_halfyear;
title1 '北美销售概况';
title2 '产品类型和季度角度分析';
class type month ;
var amount;
table type='产品类型'*(month all='半年汇总') all='汇总' ,amount=''*(n mean='平均销售金额' sum='销售金额之和');
format month quarter.;
keylabel n='销售次数';
run;
这里运用FORMAT过程定义了输出格式quarter,将month=1、2、3 归为季度1,month=4、5、6归为季度2,所以在输出报表中,我们看到 month的取值变成季度1和季度2(数据集中只有上半年的数据),并且 分类汇总也是在此基础上进行的。
接下来,将对FORMAT过程进行简要介绍。
SAS系统提供的FORMAT过程专门供用户自定义输入与输出格式。 通过FORMAT过程,用户可以自己设定输出格式,对变量的不同值或者 不同范围的值可设定不同的“标签”来显示,从而增加数据集和报表的可 读性。涉及的语法如下:
PROC FORMAT;
VALUE 格式名称 范围1='标签1'
RUN;
范围2='标签2'
…;
其中,格式名称是长度不超过8位的SAS变量名,但是不能以数字结尾,也不能和系统已有的输出格式重名。若为字符型的输出格式,格式名称必须以DOLLAR符号($)开始,包括DOLLAR符号在内不能超 过8个字符。
以下程序定义了两个输出格式。
proc format;
value $gender
'M'='Male'
'F'='Female' Other='Wrong Code';
run;
proc format;
value $grade
Low-='Under Grade'
-='Average'
-='Good'
-High='Excellent';
run;
在上述程序中,OTHER表示除了列举范围以外的所有值,包含缺 失值,一般使用在字符型输出格式中;LOW表示最小的数值,包含缺 失值;HIGH表示最大的数值。
用户自定义的输出格式和系统自带的输出格式使用方法一样。 如果没有指定逻辑库,则FORMAT过程定义的输出格式保存在图中下的位置,一经定义后,即可一直调用,但是由于是保存在临时库中的,因此一旦关闭SAS会话,它就会被删除。
为了使得定义的FORMAT能够保存下来,可在以后的SAS会话中被 调用,可以在定义FORMAT的时候如下指定逻辑库:
PROC FORMAT LIBRARY=逻辑库名;
这样一来,定义好的FORMAT就会被保存到该逻辑库中的 FORMATS目录下。选项LIBRARY=缺省时,FORMAT会被默认保存到 WORK逻辑库中的FORMATS目录下。
为了方便用户在以后的SAS会话中直接调用已经定义的FORMAT,SAS提供了一个系统选项FMTSEARCH,用于搜索指定的逻辑库及目录下面的FORMAT。选项FMTSEARCH的使用方法如下:
OPTIONS FMTSEARCH=(逻辑库名1 <逻辑库名2 … >);
例如:
Options fmtseatch=(abc xyz);
在上面的例子中,系统会首先搜索WORK.FORMATS,然后再依次 搜索ABC.FORMATS和XYZ.FORMATS,直到找到需要的FORMAT。 如果用户希望系统优先使用ABC逻辑库中的FORMAT,可以在 OPTIONS语句中如下设置:
options fmtseach=(abc work xyz);
如此一来,系统就会依次搜索ABC.FORMATS、WORK.FORMATS、XYZ.FORMATS,直到找到需要的FORMAT。 关于FORMAT过程更加详细的介绍及用法请参考SAS帮助文档。
3.控制汇总数据的输出格式
在TABULATE过程中,有以下两种方法可以控制汇总数据的输出格式:
- ·在TABLE语句的变量(或变量标签)或统计量(或统计量标签) 后面可使用下面语法控制行或列的输出格式。*F=输出格式
- ·在PROC TABULATE语句中使用选项FORMAT=,这时指定的格式 将作为所有汇总数据的输出格式,除非某些行或某些列指定了特定的输 出格式。
将汇总数据的销售额用输出格式dollar12.2显 示。
示例代码如下:
proc tabulate data=ex.sales_halfyear;
title1 '北美销售概况';
title2 '产品类型和季度角度分析';
class type month;
var amount;
table type='产品类型'*(month all='半年汇总') all='汇总',amount=''*(n='销售次数'mean='平均销售金额'*f=dollar12. sum='销售金额之和' *f=dollar12.);
format month quarter.;
run;
上述程序中,用“*F=输出格式”分别为平均销售金额和销售金额之 和的汇总数据设定了输出格式。