SAS系统和数据分析使用列表报告和汇总报告

SAS系统和数据分析使用列表报告和汇总报告
SAS系统和数据分析使用列表报告和汇总报告

第十七课使用列表报告PROC PRINT和汇总报告PROC TABULATE

利用SAS系统提供的各种过程可以制作各种风格的报表。一份好的输出报表可以使用户更直观、更清楚和更容易地了解和明白统计计算的结果,因此如何制作一个能充分揭示运算结果信息和满足要求的报告,也是非常重要的。SAS系统提供的各种制作报表的过程中,最常用的是以下两种:

●列表报告PROC PRINT过程

●汇总报告PROC TABULATE过程

一、列表报告PROC PRINT过程

所谓列表报告PROC PRINT过程,将输出SAS数据集中的数值,输出时把数据集中的每一个变量形成输出报表的列,而每一个观测形成输出报表的一行。

1.PROC PRINT过程的主要功能

PROC PRINT过程输出的数据列表具体地说主要能够做到以下几点:

●变量的输出格式用户可以选择(Format语句)

●可在输出报表中加上标题(Title)和脚注(Footnotes语句)

●可输出数据集中变量的任何子集(Where语句)

●可以控制变量是否出现以及出现的顺序(V ar语句)

●用户可以自己订制列表头(Label语句)

●可分组输出观测数据(By语句)

●可计算所有观测值或分组观测值的总和(Sum/Sumby语句)及其他统计量

●每页报表的宽度和长度以及每列的宽度都可控制(选项Width=)

●当数据集中变量太多时,可分成几部分输出(选项Rows=)

2.PROC PRINT过程语句格式

在PROC PRINT过程中,常常配合使用了许多其他SAS语句以达到所要求的输出报表格式,我们把在PROC PRINT过程中常用的一些语句的基本使用格式列出,具体使用时根据需要可能使用其中的几条语句。如下所示:

PROC PRINT<选项列表> ;

V AR变量列表;

ID变量列表;

BY变量列表;

PAGEBY变量;

SUMBY 变量;

SUM变量列表;

TITLE n “标题内容”;

FOOTNOTE n “标题内容”;

LABEL变量1=“标签*内容”变量2=“标签*内容”……;

FORMAT变量输出格式;

WHERE条件表达式;

……

Run ;

3.PROC PRINT的选项

PROC PRINT的选项列表包含许多选项,选项之间以空格分隔,选项没有先后次序。我们下面列出一些主要选项:

●DATA=数据集名——给出要打印输出的SAS数据集。如果省略,则为最近建立的

SAS数据集。

●N——要求在输出这个数据集的数据列表之后,同时输出观测的总输出条数。如果

使用了BY分组语句,在每一个分组后输出各个分组输出观测的条数。

●LABEL或L——使用变量的标签作为输出数据列表中每列的抬头。如果变量没有

定义标签,则用变量名作为列抬头。

●SPLIT或S=‘分隔符’——规定一个字符(如*号或#号)用于将较长的标签分隔

成几行。在这个选项里定义了某个分隔符以后,过程中的LABEL语句里就可以使

用这个分隔符了。另外,选项SPLIT=和LABEL不必同时使用。

●NOOBS——不输出观测数据的序号。当不用ID语句且又不要输出观测的序号时,

可使用该选项。

●DOUBLE或D——要求输出隔行打印。

●ROUND或R——对用FORMAT语句规定变量的输出格式中的小数点位进行四舍

五入。

●HEADING=H或V——规定打印列抬头的方向。H或HORIZONTAL表示所有列

抬头水平打印,V或VERTICAL表示所有列抬头垂直打印。

●WIDTH=FULL或MIN或U或UBY——规定使用什么作为列宽。FULL表示使

用变量格式化宽度,MIN或MINIMUM表示使用可能的最小列宽,U或UNIFORM

表示对所有页一致地使用变量格式化宽度,UBY或UNIFORMBY表示在BY组

内对所有页一致地使用变量格式化宽度。

●ROWS=PAGE——当数据集包含很多变量和观测时,使用此选项将在每一页中打

印尽可能多的观测,能减少输出页数。

V AR语句、ID语句和BY语句我们前面已经说明过了,这里不再重复。

PAGEBY语句要求和BY语句一起使用,当PAGEBY变量的值改变或者在BY语句中列在PAGEBY变量前的BY变量值改变时,PRINT过程将从新的一页开始输出。

SUM语句规定计算总和的变量,SUM语句中规定的变量可以没有列在V AR语句中,PRINT过程将自动把SUM语句中规定的变量加到V AR变量列表中。

SUMBY语句必须和BY语句连用,用来对一部分BY组中指定的变量求和。每当SUMBY 变量的值变化或者BY语句中列在SUMBY变量前的变量值改变时,PRINT将把对应BY组

中的SUM语句中的变量求和。如果没有规定SUM语句,则将对数据集中BY变量以外的所有数值变量求和。SUMBY语句的本质是通过指定BY变量列表中变量位置而限制BY组中SUM变量求和。

4.举例

例如,我们要输出SURVEY数据集的报表。报表之一的要求是:选择输出身高小于1.75米的观测,同时给出满足条件的总输出条数,自定义要显示的变量和顺序,不显示观测的序号,求和INCOME变量的值,修改BDA TE变量和INCOME变量输出格式,且修改它们的列标题并分两行显示,加两个标题和一个脚注。程序如下:

LIBNAME STUDY “D:\SASDA TA\MYDIR”;

PROC PRINT data=study.survey noobs n split='*' round width=min ;

V AR name sex income bdate heigh weight ;

SUM income ;

TITLE1“PROCEDURE PRINT”;

TITLE2“Dept.of Information System”;

FOOTNOTE1“SHANGHAI UNIVERSITY OF FINANCE AND ECONOMICS”;

LABEL Bdate="Date of*Brithday" Income="Total*Income";

FORMAT Bdate DATE7. Income dollar12.2 ;

WHERE heigh<=1.75 ;

Run ;

程序运行结果如图17.1所示。

图17.1 用PROC PRINT过程输出的SURVEY数据集报表之一

脚注显示在一页的最下方,通常一页的长度要大于窗口的长度,所以有时正文和脚注的内容并不一定能同时显示在OUTPUT窗口中。我们可以用Globals/Options/Global options命令,调出Options对话单,修改页尺寸PAGESIZE参数为17行,然后选择Options/Save settings now 命令保存当前的设置。

报表之二的要求是:修改报表一,按SEX变量中的值M和F进行分组求和(用BY语句),同时将分组值M和F列在分组报告的最左边(用ID语句)。要分组求和,指定数据集中的分组变量值必须事先已经按升序排序好了,如果没有排序过,常常先用SORT过程对分组变量进行排序。去掉脚注。程序如下:

LIBNAME STUDY “D:\SASDATA\MYDIR”;

PROC SORT Data=study.survey out=study.bysex ;

By sex ;

PROC PRINT data=study.bysex noobs n split='*' round width=min;

V AR name income bdate heigh weight ;

ID sex ;

BY sex ;

SUM income;

TITLE1“PROCEDURE PRINT”;

TITLE2“Dept.of Information System”;

FOOTNOTE1;

LABEL Bdate="Date of*Brithday" Income="Total*Income";

FORMAT Bdate DA TE7. Income dollar12.2 ;

WHERE

heigh<=1.75 ;

Run ;

程序运行结果如图17.2所示。

在使用了TITLE和FOOTNOTE语句后,所定义的标题和脚注将一直保持有效,直到另一个TITILE或FOOTNOTE语句被执行。我们在程序中用不带任何内容的FOOTNOTE1语句替代原先同样号码的脚注,实际上它能取消拥有更大号码的脚注。

二、汇总报告PROC TABULATE过程

当一个SAS数据集包含不太多的数据时,列表报告可以很好地描述数据,但是当数据集包含大量信息时,就需要使用汇总报告了。PROC TABULATE用分类报表的形式输出满足用户要求的描述性统计量。每一个表单元属于用交叉变量名组成的特殊观测类。与每一个单元有关的统计量是由该类所有观测值计算得到的。在通常情况下,产生汇总报表要先将数据根据需要进行分类,然后在分类的基础上计算一些统计量。

图17.2 用PROC PRINT过程输出的分组求和报表之二

1.PROC TABULATE过程的三要素

一个最简单的PROC TABULATE过程必须定义下列三要素:

●类变量——可以是数值型变量或字符型变量。分类的目的是为了在每一个类上进

行计算和分析。

●分析变量——一定是数值型变量。可以计算的一些统计量如:频数(frequency)、

均值(mean)、标准差(standard deviation)、最小值(minimum)、最大值

(maximum)、极差(range)、总和(sum)、百分数(percentages)等。

●表的结构和格式——最多可以定义三个维度:第一维定义列,第二维定义行,第

三维定义页。并且可以通过TABLE语句中的表达式计算统计量,用操作符,如:

逗号、空格、星号、圆括号等,来组织单元集合。另外,还能格式化单元中的数

据值和产生用户化的行标题和列标题。

2.PROC TABULATE语句格式

在PROC TABULATE过程中,常常使用一些控制汇总报表产生的语句,一般过程形式如下:

PROC TABULATE<选项列表> ;

CLASS分类变量列表;

V AR分析变量列表;

TABLE <<页表达式,>行表达式,>列表达式 ;

LABEL变量1=“标签*内容”变量2=“标签*内容”……;

KEYLABEL统计量名字1=“标记1”统计量名字2=“标记2”……;

FORMAT变量输出格式;

WHERE条件表达式;

……

Run ;

PROC TABULATE语句总是伴随着至少一个TABLE语句来规定如何制表。用在TABLE 语句的分类变量必须用CLASS语句说明。用在TABLE语句的分析变量必须用V AR语句说明。同时出现在CLASS语句和V AR语句中的变量,只能作为分类变量使用。CLASS、VAR 和TABLE语句是构成PROC TABULATE过程最基本的三条语句。

3.PROC TABULATE的选项

PROC TABULATE的选项列表包含许多选项,选项之间以空格分隔,几个主要的选项说明如下:

●DATA=数据集名——给出要制表输出的SAS数据集。如果省略,则为最近建立的

SAS数据集。

●NOSEPS——要求在表体中不出现水平分隔线。

●FORMCHAR<(索引表)>=’字符串’——规定用来构造报表轮廓和分隔线的字符。

字符串为11个制表字符,用来定义画垂直和水平线的2个字符,及画9个角字符:

左上、中上、右上、左中、中中(交叉)、右中、左下、中下、右下。缺省值是

FORMCHAR=’|----|+|---’。如果要改变边角线,例如想把4个角换成*,则可使用

FORMCHAR(3 5 9 11)=’* * * *’,如果FORMCHAR=选项赋了11个空格,则生

成没有边框和分隔线的报表。

●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变量是一个数值型变量,用V AR定义为分析变量,我们可以理解为它是一个产品的销售数量或收入金额或价格等。假设的数据集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

下面我们给出分析变量X和分类变量A、B、C组成的有效表达式的输出报表格式。

例1:TABLE表达式中只有一个分类变量A,既没有规定分析变量,也没有指明统计量,则缺省的统计量为频数N,即分类变量值的交叉频数。程序和输出汇总报表形式如下所示:

Proc tabulate Data=ABCX ;

Class A ;

Var X ;

Table A ;

Run ;

A

A1 A2

N N

6 6

例2:使用逗号操作符隔开TABLE语句的两个表达式将产生一个两维表格,第一个表达式定义行,第二个表达式定义列。程序和输出汇总报表形式如下所示:

Proc tabulate Data=ABCX ;

Class A B;

Var X ;

Table A , B ;

Run ;

B

B1 B2

N N

A 3 3

A1

A2 3 3

例3:使用两个逗号操作符隔开TABLE语句的三个表达式将产生一个三维表格,第一个表达式定义页,第二个表达式定义行,第三个表达式定义列。程序和输出汇总报表形式如下所示:

Proc tabulate Data=ABCX ;

Class A B C;

Var X ;

Table A , B , C ;

Run ;

第一页A A1

C

C1 C2 C3

N N N

B 1 1 1

B1

B2 1 1 1

第二页A A2

C

C1 C2 C3

N N N

B 1 1 1

B1

B2 1 1 1

例4:使用空格操作符隔开TABLE语句的两个表达式将产生一个连排表格。程序和输出汇总报表形式如下所示:

Proc tabulate Data=ABCX ;

Class A B ;

Var X ;

Table A B ;

Run ;

A B

A1 A2 B1 B2

N N N N

6 6 6 6

例5:使用星号操作符隔开TABLE语句的两个表达式将产生一个交叉等级表格。程序和输出汇总报表形式如下所示:

Proc tabulate Data=ABCX ;

Class A B ;

Var X ;

Table A *B ;

Run ;

A

A1 A2

B B

B1 B2 B1 B2

N N N N

3 3 3 3

例6:使用含有圆括号、空格和星号操作符的复合表达式。在复合表达式中,交叉操作符星号优于连接操作符空格,但可以使用圆括号操作符来改变它们的次序,如(A B)*C表达式相当于A*C B*C。程序和输出汇总报表形式如下所示:

Proc tabulate Data=ABCX ;

Class A B C ;

Var X ;

Table (A B)*C ;

Run ;

A B

A1 A2 B1 B2

C C C C

C 1

C

2

C

3

C

1

C

2

C

3

C

1

C

2

C

3

C

1

C

2

C

3

N N N N N N N N N N N N

2 2 2 2 2 2 2 2 2 2 2 2

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统计量绝对值的概率)

V AR 方差

SUMWGT 权数变量的和

PCTN 某一类中某一小类观测所占的百分比

PCTSUM 某一类观测在全部观测中所占的百分比

多个分析变量和多个统计量能够出现在同一维中,也可以出现在不同的维中。但是所有的分析变量必须出现在某一维中,所有的统计量也一样必须出现在同一维中。不能用一个分析变量同另一个分析变量交叉,统计量之间也不能交叉。例如,下面两条语句都是合法的:TABLE A*(X*MEAN X*MAX),B

TABLE A*X,B*MEAN C*MAX

另外,统计量操作元素除了可以是统计量关键字,如MEAN或MAX,也可以是以下形式的百分数表达式:

TABLE A*B*PCTN

TABLE A*B*PCTN

其中是求频数百分数时设定的分母,两条语句所求出来的百分数显然是不同的。分母为的语句比分母为的语句求出的百分数要大。

我们已经知道,在TABLE语句中分类变量都要事先在CLASS语句中定义过,但是有一个特殊的分类变量叫ALL,也称全类变量。全类变量ALL可以直接用在TABLE语句中,它仅有一个值,表示所有的子集和及总和,这是一个非常有用的类,常放在表格的最后一行和最后一列计算总和的统计量。例如下面的语句:

TABLE A*X*MEAN ALL*X*MEAN

6.定义汇总报表的输出格式

汇总报表的输出除了要构造汇总报表结构和正确地进行描述统计计算外,还应满足用户对输出报表的有关数据和标题的格式要求。有以下几种定义报表输出格式的方法:

⑴当一个分类变量、分析变量或统计量用作操作元素时,可以跟随着等号和标签。例如,

假设原来的TABLE语句为:

TABLE A*X*MEAN

现在为了修改列标题改为:

TABLE A=‘CLASS’*X=‘QUANTITY’*MEAN=‘A VERAGE’这样,输出的汇总报表中的列标题从原来的“A”变成“CLASS”,“X”变成“QUANTITY”,“MEAN”变成“A VERAGE”。

⑵操作元素还可以进行格式说明,通过*号连接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=’A VERAGE’ ALL=’TOTAL’

LABEL A=’SEX’ X=’AMOUNT’

要注意KEYLABLE和LABEL语句中定义的标签,比在TABLE语句中变量后跟随着等号和标签的定义方法优先级低。

⑷使用PROC FORMA T过程和FORMAT语句。PROC FORMAT过程用来对字符变量或数值变量定义用户自己的输入输出格式。FORMAT语句用于规定分类变量的输出格式。两者的配合使用可以使分类变量按用户自定义格式输出。例如:

PROC FORMAT;

V ALUE $SEXFMT A1=’Female’ A2=’Male’;

PROC TABULATE DATA=ABCX;

……

FORMAT A $SEXFMT ;

……

RUN ;

$SEXFMT是用户自定义的输出格式名,注意在使用时要在输出格式名后加一个小圆点。当分类变量A定义为输出格式$SEXFMT.后,在输出的汇总报表中,分类变量A原先在行或列标题上输出的是两个分类值A1和A2,现在改为输出Female和Male。

⑸使用TABLE语句中选项列表。如果规定任选项,第一项前必须加斜杆/。能够在TABLE 语句中出现很多选项,下面我们列出一些常用的选项:

●MISSTEXT=’文本字符’——报表输出时如果有缺失值,则用’文本字符’替代。

●PRINTMISS——要求输出所有可能的行和列,即使某个特殊的行和列交叉单元中

数据不存在。

●FUZZ=数字——提供一个数字,让分析变量的值和表单元中的计算结果与这个数

字比较,如果绝对值小于这个数字,看作0处理。

●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 ;

程序运行结果如图17.3所示。

图17.3 数据集SURVEY的汇总报表

在调用汇总报表过程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参数

的值。建立SAS系统的数据集(DATA

STEP)

用户用SAS数据步(DA TA STEP)创建一个数据集的方法,与前两种SAS/ASSIST和SAS/FSP创建一个数据集的方法相比,DA TA STEP是一种非交互式的全部编程实现的方法。这种方法能把多样的、复杂的外部文件数据格式通过程序语句的控制转换为我们所需的SAS 数据集。

一、DATA程序步的三个主要步骤

为了从外部原始数据文件得到SAS数据集,DATA程序步的三个主要步骤为:

●启动一个数据步,命名将要创建的数据集(使用DATA语句)

●确定要读入的外部文件(使用INFILE语句)

●描述如何读入每一条记录(使用INPUT语句)

如果需要在程序中直接嵌入数据,第二步用CARDS语句代替INFILE语句。所对应的一般程序结构如下:

Data所要创建的数据集名;

Infile ‘读取的外部文件名’ < FIRSTOBS=开始读入的行>< OBS=结束行> ;

Input 变量1 读入模式变量2 读入模式……;

Run ;

此程序结构很容易被错误理解为顺序结构,其实它的内部执行结构是一种循环结构。如图8.4所示是它执行过程的程序流程图。

PDV (Program Data Vector )称为程序数据向量,它是根据DATA 步中的INPUT 语句所确定的变量和变量的读入模式来创建的,假设INPUT 语句中各变量的长度为 name $1-8 、sex $1-2 、bdate 1-8 、age 1-3 、height 1-6、 weight 1-6 、income 1-8、 sdate 1-6 ,所创建的一个PDV 如下表:

name sex bdate age height weight income sdate

8

2

8

3

6

6

8

6

整个DATA 步程序执行过程中,涉及到: ● 一个存放外部文件记录的输入缓冲区 ● 一个存放当前观测的PDV 向量 ● 一个外部文件记录指针 ● 一个程序指针

● 一个SAS 数据集观测指针 如图8.5所示。

Y

N

程序返回D A T A 步的顶部

退出D A T A 步循环,形成S A S 数据集开始下一个D A T A 步或P R O C 步

D A T A 开始,并确定创建数据集名

IN P U T 语句将文件下一条记录读入P D V

其它语句可以修改P D V 中的内容

P D V 中值在D A T A 步底部被写入数据集

IN F IL E 语句确定外部原始文件

用IN F IL E 所涉及到变量建立

P D V ,并初始化外部文件下一条记录

是否为空?

图8.4 执行DA TA 步时的内部循环过程

数据步

DATA

输入缓冲区 INFILE输出缓冲区

INPUT

外部数据文件…SAS数据集

123 (234)

RUN

+111

PDV

123+111=234

图8.5 文件记录指针、程序指针、观测指针

二、读入模式

确定变量的读入模式共有四种:

●column模式

●formatted模式

●list模式

●named模式

我们在这里将介绍三种主要的column模式、formatted模式和list模式。

1.Column模式

Column模式适用于读入数据固定在某些列中或数据中只包含标准的字符和数字。在INPUT语句中的一般使用形式如下:

Input变量1 < $> 开始列<-结束列><.小数位> 变量2 …… ;

变量后不带$符号表示此变量读取数字。

例如,我们在NOTEPAD记事本程序中输入如图8.6所示的内容,操作如下:

●在Windows桌面上的开始菜单中选择

●程序/附件/记事本——打开NOTEPAD程序方法

●并以Testdata.dat文件名存入到D:\sasdata\mydir目录下,作为一个我们用来实验

的外部文件

相应地,在SAS 系统的PROGRAM EDITOR 中提交下面程序:

Data

testd1 ;

Infile ‘d:\sasdata\mydir\testdata.dat’ firstobs=2 obs=4 ;

Input code $ 1-8 sex $ 9 bdate $ 10-16 income 17-23 .2 ; Proc print data=testd1 ; Run ;

上面的程序的数据步在临时库WORK 中创建了SAS 数据集work.testd1,而过程步PRINT 则显示该数据集,在OUTPUT 窗口中显示的运行结果如图8.7所示。

2. Formatted 模式

Formatted 输入模式适合于含有不标准数据的文件,是一种更常用的输入模式。它有一根指针来先定位输入数据的开始位置,输入格式放在相应变量之后,输入格式指出了数据的类型和取值的宽度。它有以下两种格式:

格式一:

图8.6 用NOTEPAD 程序创建外部文件

图8.7 用Column 模式读入外部文件后的SAS 数据集

Input <指针控制> 变量1 输入格式<@|@@>… ;

格式二:

Input <指针控制> (变量表) (输入格式表) <@|@@> ;

<@|@@>是行固定说明符,可选项。

●单尾符@作用是为了执行下一条INPUT语句时,仍然把指针保持在当前输入的记

录上。用于一个数据行用多条INPUT语句读取数据。

●双尾符@@作用是为了执行下一条INPUT语句时,甚至在DATA步重复执行时,

仍然把指针保持在当前输入的记录上。用于一个数据行含有多条观测值时读取数

据。

行固定说明符也适用于Column模式。

(1)使用单尾符@

例如,对外部文件Testdata.dat也可以采用多条INPUT语句读取数据,DATA步程序如下:

Data testd2 ;

Infile‘d:\sasdata\mydir\testdata.dat’ ;

Input code $ 1-8 sex $ 9 @ ;

Input bdate $ 10-16 income $17-23 .2 ;

Proc print data=testd2 ;

Run ;

(2)使用双尾符@

如果外部文件testdata.dat中的四条记录数据不是按四行而是按一行的形式存放的,DATA 步程序如下:

Data testd2 ;

Infile‘d:\sasdata\mydir\testdata.dat’;

Input code $ 1-8 sex $ 9 bdate $ 10-16 income $17-23 .2 @ @ ;

Proc print data=testd2 ;

Run ;

(3)使用指针控制

指针控制可以把指针在行及列中的缺省位置当前行第一列重新定位,使INPUT语句知道从哪行哪列开始读取数据。下表列出了可以同INPUT语句一起使用的两种类型的指针控制。

指针控制相对位置绝对位置

列指针控制+表达式值@表达式值

行指针控制/ #表达式值

例如,下面的DA TA步程序是把列指针定位在第10列。

Data testd3 ;

Infile‘d:\sasdata\mydir\testdata.dat’;

a=2 ;

b=5 ;

Input@(a*b) bdate $ 7. ;

Proc print data=testd3;

Run ;

OUTPUT窗口中运行结果如图8.8所示。

“/”表示行指针移到下一行的第一列。例如,下面的数据步程序读取的是左上角到右下角对角线上的一条记录。

Data testd4 ;

Infile ‘d:\sasdata\mydir\testdata.dat’;

Input code $ 1-8 / sex $ 9 / bdate $ 10-16 / income 17-23 .2 ;

Proc print data=testd4;

Run ;

在OUTPUT窗口中显示的运行结果如图8.9所示。

图8.8 用列指针控制读入外部文件后的SAS数据集

相关主题
相关文档
最新文档