eatea 发表于 2012-5-7 12:55 
非常感谢你的回复,可以解释下面语句的意思么?
proc format;
value count /right
嗯,我好好帮您做
事实上您的这个表格使用proc tabulate就可以做好了
我来详细讲解一下proc tabulate的用法,您可以自己定制合适的表格了
PROC TABULATE过程的三要素
一个最简单的PROC TABULATE过程必须定义下列三要素:
l 类变量——可以是数值型变量或字符型变量。分类的目的是为了在每一个类上进行计算和分析。
l 分析变量——一定是数值型变量。可以计算的一些统计量如:频数(frequency)、均值(mean)、标准差(standard deviation)、最小值(minimum)、最大值(maximum)、极差(range)、总和(sum)、百分数(percentages)等。
l 表的结构和格式——最多可以定义三个维度:第一维定义列,第二维定义行,第三维定义页。并且可以通过TABLE语句中的表达式计算统计量,用操作符,如:逗号、空格、星号、圆括号等,来组织单元集合。另外,还能格式化单元中的数据值和产生用户化的行标题和列标题。
2. PROC TABULATE语句格式
在PROC TABULATE过程中,常常使用一些控制汇总报表产生的语句,一般过程形式如下:
PROC TABULATE <选项列表> ;
CLASS 分类变量列表 ;
VAR 分析变量列表 ;
TABLE <<页表达式,>行表达式,>列表达式</表选项> ;
LABEL 变量1=“标签*内容” 变量2=“标签*内容”…… ;
KEYLABEL 统计量名字1=“标记1” 统计量名字2=“标记2”…… ;
FORMAT 变量输出格式 ;
WHERE 条件表达式 ;
……
Run ;
PROC TABULATE语句总是伴随着至少一个TABLE语句来规定如何制表。用在TABLE语句的分类变量必须用CLASS语句说明。用在TABLE语句的分析变量必须用VAR语句说明。同时出现在CLASS语句和VAR语句中的变量,只能作为分类变量使用。CLASS、VAR和TABLE语句是构成PROC TABULATE过程最基本的三条语句。
3. PROC TABULATE的选项
PROC TABULATE的选项列表包含许多选项,选项之间以空格分隔,几个主要的选项说明如下:
l DATA=数据集名——给出要制表输出的SAS数据集。如果省略,则为最近建立的SAS数据集。
l NOSEPS——要求在表体中不出现水平分隔线。
l FORMCHAR<(索引表)>=’字符串’——规定用来构造报表轮廓和分隔线的字符。字符串为11个制表字符,用来定义画垂直和水平线的2个字符,及画9个角字符:左上、中上、右上、左中、中中(交叉)、右中、左下、中下、右下。缺省值是FORMCHAR=’|----| |---’。如果要改变边角线,例如想把4个角换成*,则可使用FORMCHAR(3 5 9 11)=’* * * *’,如果FORMCHAR=选项赋了11个空格,则生成没有边框和分隔线的报表。
l MISSING——要求把丢失值作为分类变量的有效水平。即汇总时包含分类变量中有丢失值的观测。
4. TABLE语句的使用和输出表格结构
如何正确地理解和使用TABLE语句是掌握PROC TABULATE过程的关键所在。汇总报表输出的表格形状和所计算的统计量都是由TABLE语句中的表达式决定的,这个表达式中包含元素和操作符。元素指分类变量、分析变量和统计量,当表达式包含多个元素时,需要用操作符把它们连接起来。使用不同的操作符连接会产生不同的表格形状。下面列出一些主要的操作符及其作用:
TABLE表达式中的操作符
作用
逗号 ,
转另一维
空格
表格并排连接
星号 *
交叉组合分组
圆括号 ( )
分组或规定次序
为了便于理解TABLE表达式中操作符的作用,我们举一个假设的例子来说明。有SAS数据集ABCX,其中有四个变量A、B、C和X,变量A、B、C我们将在PROX TABULATE过程中用CLASS语句定义为分类变量,我们可以理解为它是一个产品的大类A、中类B和小类C。而X变量是一个数值型变量,用VAR定义为分析变量,我们可以理解为它是一个产品的销售数量或收入金额或价格等。假设的数据集ABCX可能的数据值如下表所示:
变量名
TABLE中的变量类型
可能的数据值
A
分类变量
A1,A2
B
分类变量
B1,B2
C
分类变量
C1,C2,C3
X
分析变量
111~223
ABCX数据集中的具体观测值见下表所示:
OBS
A
B
C
X
1
A1
B1
C1
111
2
A1
B1
C2
112
3
A1
B1
C3
113
4
A1
B2
C1
121
5
A1
B2
C2
122
6
A1
B2
C3
123
7
A2
B1
C1
211
8
A2
B1
C2
212
9
A2
B1
C3
213
10
A2
B2
C1
221
11
A2
B2
C2
222
12
A2
B2
C3
223
5. 汇总报告中计算统计量
在TABLE语句中使用星号操作符连接分析变量和统计量,如TABLE A*X*MEAN,其中A是分类变量,X是分析变量,MEAN是统计量,则可以对指定的分析变量X计算指定MEAN统计量。在TABLE语句中如果没有规定分析变量,则N或PCTN(频数N的百分数)可作为统计量使用,如TABLE A*N或TABLE A*PCTN。如果TABLE语句中规定了分析变量,但没有指定统计量时,如TABLE A*X,则SUM作为统计量。如果TABLE语句中既没有出现分析变量如X,又没有出现统计量如MEAN,例如上面的例1~6中的TABLE语句都没有规定分析变量和统计量,如TABLE A 语句只规定了分类变量A,则每个表单元将给出分类变量的交叉频数。
在TABLE语句中如果规定了分析变量,则可以要求计算下表所示的一个或几个统计量。
统计量
作用
N
确定的子组中含有有效数据的观测数
NMISS
确定的子组中含有缺失值的观测数
MEAN
算术平均
STD
标准误差
MIN
最小值
MAX
最大值
RANGE
极差(取值范围)
SUM
总和
USS
未修正的平方和
CSS
关于均值修正的平方和(也称偏差平方和)
STDERR
均值的标准误差
CV
变异系数
T
检验总体均值为0假设时,t统计量的值
PRT
显著性概率(大于t统计量绝对值的概率)
VAR
方差
SUMWGT
权数变量的和
PCTN
某一类中某一小类观测所占的百分比
PCTSUM
某一类观测在全部观测中所占的百分比
多个分析变量和多个统计量能够出现在同一维中,也可以出现在不同的维中。但是所有的分析变量必须出现在某一维中,所有的统计量也一样必须出现在同一维中。不能用一个分析变量同另一个分析变量交叉,统计量之间也不能交叉。例如,下面两条语句都是合法的:
TABLE A*(X*MEAN X*MAX),B
TABLE A*X,B*MEAN C*MAX
另外,统计量操作元素除了可以是统计量关键字,如MEAN或MAX,也可以是以下形式的百分数表达式:
TABLE A*B*PCTN<A*B>
TABLE A*B*PCTN<A>
其中<A*B>和<A>是求频数百分数时设定的分母,两条语句所求出来的百分数显然是不同的。分母为<A>的语句比分母为<A*B>的语句求出的百分数要大。
我们已经知道,在TABLE语句中分类变量都要事先在CLASS语句中定义过,但是有一个特殊的分类变量叫ALL,也称全类变量。全类变量ALL可以直接用在TABLE语句中,它仅有一个值,表示所有的子集和及总和,这是一个非常有用的类,常放在表格的最后一行和最后一列计算总和的统计量。例如下面的语句:
TABLE A*X*MEAN ALL*X*MEAN
6. 定义汇总报表的输出格式
汇总报表的输出除了要构造汇总报表结构和正确地进行描述统计计算外,还应满足用户对输出报表的有关数据和标题的格式要求。有以下几种定义报表输出格式的方法:
⑴当一个分类变量、分析变量或统计量用作操作元素时,可以跟随着等号和标签。例如,假设原来的TABLE语句为:
TABLE A*X*MEAN
现在为了修改列标题改为:
TABLE A=‘CLASS’*X=‘QUANTITY’*MEAN=‘AVERAGE’
这样,输出的汇总报表中的列标题从原来的“A”变成“CLASS”,“X”变成“QUANTITY”,“MEAN”变成“AVERAGE”。
⑵操作元素还可以进行格式说明,通过*号连接FORMAT或F=输出格式名。例如:
TABLE A=‘CLASS’*f=12.2*X=‘QUANTITY’*f=10.2*MEAN=‘AVERAGE’*f=8.
要注意分类变量A这个元素后的输出格式是数字格式f=12.2,而不是字符格式,因为它说明的是交叉单元中MEAN计算的数字结果。实际上起作用的是最后一个f=8.的格式说明。
⑶使用KEYLABLE和LABEL语句。KEYLABLE语句用于对出现在页、行或列上的统计量名字和ALL分类变量名字重新标记。LABEL语句用于对出现在页、行或列上的分类变量或分析变量规定标签。例如:
KEYLABEL MEAN=’AVERAGE’ ALL=’TOTAL’
LABEL A=’SEX’ X=’AMOUNT’
要注意KEYLABLE和LABEL语句中定义的标签,比在TABLE语句中变量后跟随着等号和标签的定义方法优先级低。
⑷使用PROC FORMAT过程和FORMAT语句。PROC FORMAT过程用来对字符变量或数值变量定义用户自己的输入输出格式。FORMAT语句用于规定分类变量的输出格式。两者的配合使用可以使分类变量按用户自定义格式输出。例如:
PROC FORMAT;
VALUE $SEXFMT A1=’Female’ A2=’Male’;
PROC TABULATE DATA=ABCX;
……
FORMAT A $SEXFMT ;
……
RUN ;
$SEXFMT是用户自定义的输出格式名,注意在使用时要在输出格式名后加一个小圆点。当分类变量A定义为输出格式$SEXFMT.后,在输出的汇总报表中,分类变量A原先在行或列标题上输出的是两个分类值A1和A2,现在改为输出Female和Male。
⑸使用TABLE语句中选项列表。如果规定任选项,第一项前必须加斜杆/。能够在TABLE语句中出现很多选项,下面我们列出一些常用的选项:
l MISSTEXT=’文本字符’——报表输出时如果有缺失值,则用’文本字符’替代。
l PRINTMISS——要求输出所有可能的行和列,即使某个特殊的行和列交叉单元中数据不存在。
l FUZZ=数字——提供一个数字,让分析变量的值和表单元中的计算结果与这个数字比较,如果绝对值小于这个数字,看作0处理。
l RTS=数字——提供一个整数,用来规定行标题输出时的左和右边界值。
⑹使用PROC TABULATE语句中的FORMAT=输出格式名选项。对每一个报表单元规定缺省的输出格式,如果没有规定此选项,缺省值是BEST12.2。此选项主要用于减少报表中输出数值的域宽。但是如果遇到在TABLE语句中规定有任何输出格式,它将被取代。
7. 汇总报表综合举例
假设我们要输出一个数据集SURVEY的汇总报表。按性别SEX和全类ALL进行分类,求平均年龄AGE、最大的身高HEIGH、最小的重量WEIGHT、平均收入INCOME和男女人数的百分比PCTN。修改大标题和增加一个小标题,并格式化输出表格的行列标记和单元内容。程序如下:
libname study "d:\sasdata\mydir";
proc format ;
value $sexfmt F='female' M='male' ;
picture pct low-<0='000.00%' (prefix='-')
0-high='000.00%' ;
proc tabulate data=study.survey formchar='|----| |---' format=8.2 ;
class sex ;
var age heigh weight income ;
table (SEX ALL),
(AGE*mean*f=7. heigh*MAX weight*MIN income*MEAN pctn*f=pct.) /rts=8 ;
format sex $sexfmt. ;
Keylabel MEAN="Average" ALL="Total" ;
Label income='Salary' ;
Title1 'How to use tabulate statement' ;
Title2 'SUFE 2001' ;
Run ;
在调用汇总报表过程PROC TABULATE输出报表之前,首先使用PROC FORMAT过程定义了一个格式值$SEXFMT和一个图示格式PCT。定义的PCT是一种较常用的百分比格式,其中low-<0表示从最小值LOW到不包含0的值域,0-high表示从0到最大值的值域,圆括号中的选项prefix='-'表示放在该值第一个有效数位前面的一个字符词头(前缀)。其他还有像fill='*'填充字符选项也较常用。
汇总报表过程PROC TABULATE中,规定分类变量为SEX,分析变量为age、heigh、weight 和income。在TABLE语句中有二维,为清楚起见,一条语句按维定义分二行书写,注意只有一个分号(;)。行维的表达式和列维表达式之间用逗号(,)分隔。
调整分析变量age、heigh、weight 和income的列宽,既可以在PROC TABULATE语句的选项中设置format=8.2进行统一调整,也可以在TABLE语句中针对AGE变量用f=7.进行调整。formchar='|----| |---'选项规定输出表格的垂直和水平分隔线及9个角的字符,/rts=8选项规定左右边界的距离,实际上调整了分类变量SEX列的宽度,rts=8的值越大,SEX列的宽度越小。或者选择Globals\Options\Global options命令,在OPTIONS对话框中修改LINESIZE参数