通过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语句。

  1. 在TABULATE过程中,任何一个变量都只能是分类变量或分析变量,但不可以既作为分类变量又作为分析变量。
  2. TABLE语句中出现的任何变量都必须在CLASS语句或者VAR语 句中出现过。
  3. 所有分析变量必须出现在一个维度(列、行或者页)中,也就 是说,仅有一个维度的表达式中包含分析变量。

在使用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-3='季度1'
4-6='季度2'
7-9='季度3'
10-12='季度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-59='Under  Grade'
60-80='Average'
81-90='Good'
91-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.2  sum='销售金额之和'  *f=dollar12.2);
format  month  quarter.;
run;

上述程序中,用“*F=输出格式”分别为平均销售金额和销售金额之 和的汇总数据设定了输出格式。

转载于:https://www.cnblogs.com/suolilian/p/10594424.html

通过TABULATE过程制作汇总报表相关推荐

  1. 通过PRINT过程制作报表

    通过PRINT过程制作报表 PRINT过程是SAS中用于输出数据集内容的最简单常用的过程,它可将选择的观测和字段以简单的矩形表格形式输出. 1.1 制作简单报表 使用PRINT过程最简单的语法形式如下 ...

  2. access如何设置定期报表汇总_Access如何制作复杂报表

    如何制作复杂报表--利用Excel输出复杂报表 在读这篇文章以前首先要提醒大家,Access 本身的报表也具有很强的实用性和强大的功能,只有当你发掘了其本身全部的功能却仍不能满足你对报表的特殊要求时才 ...

  3. python制作数据库报表_如何制作数据报表并实现自动化?

    定期的数据报表,包括日报.周报.月报.半年报.年报,是每一位数据运营或数据分析师可能遇到的工作,需求方主要包括产品运营部门和各业务部门.基于不同公司的不同发展阶段,遇到的报表工作"层次&qu ...

  4. 巧用Excel 2010数据透视表制作销售报表

    小刘需要根据2010-2011两年间的订单记录创建季度报表,以便分析各类图书的销售情况.面对如此庞大的订单记录,该从何下手呢? 其实最快捷的办法是使用Excel 2010创建数据透视表,以快速合并和比 ...

  5. 多层科目任意组合汇总报表的性能优化 (上)

    一 问题背景 我们先来看一张资产负债表: 这是一个典型的中国式复杂报表格式,其复杂并不在于布局,而在于其中"期末余额"的每个单元格都是一个需要独立计算的指标,互相之间几乎没有关系, ...

  6. 使用web设计器制作图表报表

    课程二十六:如何制作图表报表 说明:在报表中,使用图表展示数据会更清晰明了.本课程以"销量"表为例,讲解如何用盈帆报表做图表. 第一步:认识图表 点击菜单栏"插入&quo ...

  7. 拥有数据报表模板,不再愁如何制作数据报表

    制作数据报表首先需要明确自己需要分析的数据,然后对数据进行处理,虽然看起来很基础,但是这些却需要一些基本功.有了数据,下一步就是进行数据呈现,也就是制作我们的数据报表啦. 随着数据量的增多,数据报表分 ...

  8. java pdf 报表_关于Java向PDF模板写入数据,以及java制作pdf报表的问题

    1.关于java向PDF模板写入数据 写的特别全一步一步来就行. (1)首先下载一个pdf编辑工具Adobe Acrobat DC (2)准备一个pdf模板文件(你可以把自己创建一个只有表头没有内容的 ...

  9. SAS学习6(freq过程、tabulate过程、univariate过程、plot过程、chart过程)

    作业题 赌大小,三颗骰子猜数字或者大小 但是这里如果押注大,但是扔出来是3个六,仍然会输 即无论押注大或小如果骰子的旋转结果为三个同号那么算输 具体规则百度吧,挺有意思的 freq过程 画出频数表,t ...

  10. 第10讲 使用 SAS 制作统计分析报表

    本节所用数据集: 链接:https://pan.baidu.com/s/1lV88p8DQLbpYIrRDJAJUyA  提取码:wpl0 一.tabulate 制表过程 1. 由分类变量.分析变量和 ...

最新文章

  1. 万众期待的kintone开发账号免费开放申请啦!
  2. js去掉最右边的逗号
  3. Windows 技术篇 - 无需确认快速删除包含大量文件的目录,cmd删除文件的rmdir、del、erase和rd四种命令使用方法
  4. Java Calendar 获取时间为明天的上午10点
  5. 数据结构-栈的顺序结构两种方式
  6. .xz是什么文件怎么解压_zip解压app下载-zip解压app安卓版下载v11.5.6
  7. aardio教程_官方AARDIO课程已经开课了!学习的速来报道!
  8. 钱币掉落动画android,mpvue实现小程序签到金币掉落动画(api实现)
  9. 开源社区慌不慌?又一个 Linux 发行版宣告死亡
  10. wget抓取网站, 模拟手机端抓取
  11. python和c#交互_python与C#的互相调用
  12. python小白教程-面向小白的Python教程:入门篇(六)
  13. 403保护网站服务器,HTML5服务器禁止访问403错误动画
  14. 《信号与系统学习笔记》—通信系统(一)
  15. Python数据分析之简书七日热门数据分析
  16. 学生干部管理系统的现状分析和可行性分析
  17. zoj3869 Ace of Aces zoj3880 Demacia of the Ancients(水)
  18. 1024献礼,全栈工程师进击
  19. 静态背景下运动目标检测 matlab_动态拉伸、静态拉伸你做对了么?
  20. 消息中间件选型分析:从 Kafka 与 RabbitMQ 对比

热门文章

  1. 解决Office2007安装时出现错误1706的方法
  2. linux mbr gpt 区别,MBR、GPT的结构和区别
  3. 看视频用这个太爽了!自动实时翻译英语视频
  4. 异步fifo_【好设计论文】一种面向异步FIFO的低开销容错机制研究
  5. 产品经理的自我修养:认知模式
  6. 高通MSM8953平台调整通话音量
  7. vue导出服务器上的excel文件,详解如何在Vue项目中导出Excel
  8. 电吉他弦距测试软件,测吉他弦距的简单方法
  9. 手机裁剪圆角图片_Photoshop裁剪圆角图片方法
  10. 论文阅读笔记:A brief introduction to weakly supervised learning