第三章建立数据集.docx
《第三章建立数据集.docx》由会员分享,可在线阅读,更多相关《第三章建立数据集.docx(29页珍藏版)》请在冰点文库上搜索。
第三章建立数据集
第三章建立SAS数据步
数据步是SAS数据处理的核心部分,用来对外部数据文件、数据库文件或已经建立的SAS数据集进行处理,从而生成用于SAS其它各模块进行应用分析所需的有效数据。
第一节数据步流程
无
在数据步中,DATA语句总是标志着这个步的开始。
对输入数据中的每一观测值都执行一遍这个程序。
有
在DATA步中提及的所有变量都成了当前数据矢量(PDV)的一部分。
来自每一输入数据源的变量与程序语句建立的变量一起放在程序数据矢量中。
当执行到DATA步中的最后一条语句(或者一个引起返回到该步的开始,去重新执行的RETURN语句)时,通常从程序数据矢量中将当前值写到正被建立起的SAS数据集中。
SAS返回到DATA语句后的第一个语句,初始化程序数据矢量中的非保留变量为缺项值,并且开始执行语句去建立下一个观测值。
当SAS已读入并处理了来自某一输入文件的所有的数据后,该数据步即执行完成,它继续执行下一DATA步或PROC步。
DATA步被执行多少次?
对读入的每一记录,都执行DATA步中的各个语句。
这一程序步被反复执行,直到将一个输入源中的数据读完,或者直到一个STOP或ABORT语句被执行。
程序语句可以包括那些使DATA步中的其他语句被多次执行的语句,如DO循环,LINK/RETURN或GOTO语句。
对于每一DATA步,SAS自动产生变量_N_,它的值是SAS执行这个DATA步的次数。
在DATA步的程序语句中你能使用这个值去控制程序的执行。
一个典型的SAS作业包含有一个INPUT语句,这语句描述了在磁盘上或在控制台上送入的数据值。
在INPUT语句中,给出的变量组成了程序数据矢量的一部分。
例如,以下的DATA步:
datafitness;
inputnumsex$weightheight;
ratio=weight/height;
cards;
1001F19471.69
1002M20551.74
1003F18491.86
;
run;
这些语句要求SAS建立一个名为FITNESS的数据集。
从输入的数据行中读4个变量并且建立第5个变量RATIO。
这个数据步的程序数据矢量中包含5个变量:
NUMSEXWEIGHTHEIGHTRATIO
SAS按INPUT语句中的指示读当前记录的数据值,并执行编程语句,把RATIO的值加入到程序数据矢量中。
在最后一条程序语句之后,程序数据矢量的值(观测值)被自动地加到正在建立的数据集FITNESS中,(这个自动输出等同于一个OUTPUT语句存在所发生的情况)。
SAS返回去再次执行这一DATA步,这种自动返回等同于RETURN语句存在时所发生的情况。
这个DATA步将被执行3次。
新的数据集FITNESS将包含有3个观测值,每一观测值包含5个变量。
第二节在数据步中所用的语句
下面列表简述在数据步中所用的语句及作用。
表3.1文件操作语句
语句
作用
DATA
表明数据步的开始,并指明所建立的数据集名称.
INPUT
表明数据的变量名、顺序、类型
CARDS
表明数据行的开始,它一定要放在其他语句后面
CARDS4
当数据含有分号时,用来指示数据行的开始,用“;;;;”表示数据结束
INFILE
如果数据来自外部文件,则用INFILE语句指明文件名
SET
从另一数据中读入数据或将两个数据集中的数据纵向连接
MERGE
将两个数据集中的各观测值横向合并
UPDATE
利用一个数据集中的数据项更新另一数据集中相应的项
FILE
指出文件名
表3.2作用语句
语句
作用
赋值
产生变量或改变变量值
求和
计算累加和
建子集IF
仅处理满足IF语句规定条件的观测值
DELETE
删除观测值
OUTPUT
将数据矢量流中的内容写入数据集
MISSING
规定特殊的缺项值
STOP
中断数据步
表3.3控制语句
语句
作用
IF-THEN/ELSE
条件判断
GOTO
转向语句
DO
DO组开始
循环DO
根据控制变量的变化进行循环
END
DO组结束
LINK
转向标记指出的程序处执行,遇到RETURN语句返回到该LINK语句的下一语句处继续执行
RETURN
返回到DATA步开始处或LINK语句的下一语句
表3.4信息语句
语句
作用
ATTRIB
指明变量特性
FORMAT
指定变量输出格式
INFORMAT
指定变量输入格式
LABEL
进一步明确变量名所代表的意义
LENGTH
说明变量的长度特性
RETAIN
设变量初始值
RENAME
改变变量名
ARRAY
定义数组
BY
定义分组处理
DROP
指定不写到数据集中的变量
KEEP
指定要写到数据集中的变量
第三节DATA步基本语句
一、DATA语句
语句格式:
data[数据集名][选择项];
处理程序实体;
run;
DATA语句的作用是表明数据步的开始,并给出所建数据集的名称。
数据集名必须以英文字母开始。
所有的数据集名都是由句号”.”分隔的两部分组成。
第1部分称作1级名(或库逻辑名),它标识数据集所存储的位置;第2部分(2级名)标识特定的数据集。
如果不想把数据集永久存于磁盘上,可仅使用第二部分数据集名。
比如建立一个名为FITNESS的数据集,使用DATAFITNESS;SAS系统把FITNESS作为数据集名的第二部分,并自动以WORK作为第一部分,因此在LOG窗口显示的信息中称该数据集为WORK.FITNESS。
若第一级名是WORK,数据集就是临时的,它仅在当前会话期间有效。
如果仅仅想在DATA步中执行一些语句而不想建立一个SAS数据集,我们可在DATA步中使用特殊的SAS数据集名_NULL_。
例如:
DATA_NULL_;
A=SIN(3.1415/4);
B=INT(A*100);
PUTAB;
RUN;
运行后在LOG窗口打出A与B的值,而不建立数据集。
在DATA语句中可以为建立数据集提供更多的信息(数据集选择项)。
在DATA语句中,如果不给出数据集名,则SAS自动以DATA1,DATA2等依次命名所建立的数据集。
在SAS系统中可同时存在多个数据集,各数据集以名称标识。
处理某一数据集中的数据时,应指出该数据集的名称,如果不指出名称则处理最后建立的数据集(又称当前数据集)。
DATAD1;
INPUTAB;
CARDS;
35
79
;
RUN;
DATAD2;
INPUTCD;
CARDS;
1315
1719
2123
;
RUN;
这时建立起两个数据集D1和D2,由于D2是最后建立的,故它为当前集。
若调用PRINT过程打印数据集D1中的内容时,必须用PROC语句的选择项DATA=指出数据集名,否则打印的是D2中的内容。
PROCPRINTDATA=D1;
RUN;
数据集中各个观测值用一特殊变量OBS来标识。
PROCPRINT;
RUN;
二、INPUT语句
INPUT语句用来描述在输入记录中的数据,并把输入值赋给相应的变量。
用INPUT语句是为了读一个外部文件的数据,或是跟在CARDS语句后的数据。
如果数据已经在数据集中,应使用SET、MERGE或UPDATE来代替。
INPUT语句的一般格式:
INPUT[specification]
有三种方法对INPUT语句中记录的值进行描述:
·列
·列表或自由格式
·格式化
除非在INPUT语句中的变量名后跟一$符号,或用字符的输入格式表示,或该变量已被事先定义成字符型,否则SAS系统认定用INPUT语句读入的值是数值型的。
如果说明的数据类型和数据不相符,则SAS系统按无效数据处理,将该变量的值置为缺项值。
1、列表输入
在前面所见的例子中,所用的INPUT语句都是用列表输入法读入数据的。
用列表输入时,变量简单地列在INPUT语句中,例如:
INPUTNAME$AGE;
列表输入是最简单的数据输入方法,它只要把要被赋值的变量列在INPUT语句中,不必了解在输入记录中数据占有哪些列。
使用列表输入时,数据都是由一个或多个空格或是由一个输入记录的结束来定界的。
除非明确地规定字符型数据的长度。
否则其缺省值是8个字节。
如果要读入较长的数值,就要使用格式化输入,即指定一输入格式,或是用列输入或是在LENGTH,ATTRIB,INFORMAT语句中定义变量的长度。
注意:
(1)在INPUT语句中列出的变量的顺序与输入数据中它们相应的值的顺序必须一致。
(2)不能用简单的列表输入有选择地读入数据。
譬如,输入行含有变量A,B,C,D,E的每个值,但你仅想用A,B,D的值。
用简单的列表输入就不能跳过C,但可仅读A,B,C,D的值,而省去E,因E在D的后面。
例如:
INPUTABCD;
(3)在列表输入的数据中,缺项值必须用一个句号来代表。
(4)因空格表示数据值的结束,用列表输入不能将数据前面、后面的空格有效地读入,更无法读中间有空格的数据。
(如果想把数据前后带有的空格读入,应使用列输入方式或格式化输入方式。
)
2、列输入
使用列输入时,在INPUT语句变量名后要指出变量值所处的列号。
当在所有的输入行中同一变量值位于相同的列上时,可使用列输入。
例如,如果在所有的输入数据行中数值变量COUNT都位于第7至第9列,则INPUT语句为:
INPUTCOUNT7-9;
该语句从每个输入数据行的第7至第9列中读取变量COUNT的值。
列输入的特点是:
1)输入值可以以任何顺序读入,而不理会它们在输入记录中的位置。
例如语句:
INPUTFIR73-80SEC10-12;
首先从73列到80列读入变量FIR的值,然后从第10列到第12列读入变量SEC的值。
2)字符型数据中可包含空格。
3)字符型数据可以最多到200个字符长。
4)可读取全部或部分数值。
例如,语句:
INPUTID10-15GROUP13;
第10至15列含有ID的值;ID的第四个数字即第13列又是GROUP的值。
空格或只含一个句号(.)的字段被解释为缺项值。
在列输入中,对于字段前面和后面的空格都不加考虑。
这样如果你用如下语句:
INPUTCOUNT7-9;
若COUNT的值在第7和第8列,而第9列是空格,那么仅使用第7,8列的值。
3、格式化输入
用格式输入,要在INPUT语句变量后给出一个输入格式。
输入格式用来说明变量的数据类型、字段的宽度及其它特殊格式。
INPUTNAME$10.H4.2;
其中变量NAME是字符型变量,变量长为10,其格式是$10.;H是数值型变量,变量长为4,小数点后有两位小数,H的输入格式是4.2。
如果在CARDS语句后给出的H值是167,则根据4.2格式也会读成1.67。
格式输入特别适用于读入日期型的量。
由于日期在不同的地方表示习惯不同,有用mmddyy形式表示,如031592或03/15/92或03-15-92;也有用ddmmyy形式表示,如12JAN93等等。
为能读入这些日期型的数据,SAS中设计了许多种输入格式。
例如:
datadays;
inputnum$4.birthdaymmddyy10.testdaydate10.wt;
cards;
100107-21-963Mar9710
100210/30/9614/Jan/974
100306199613Jun19979
l00403079729Aug973
;
run;
procprint;
formatbirthdaymmddyy10.testdaydate10.;
run;
注意:
(1)由于格式化读入时,读数据指针按给出的格式长度移动,两数据间的空格也要计算在内。
MMDDYY10.格式读入日期值时,日期值最长占10列。
如格式给出的长度不足,则会出现数据截尾。
DATE10.格式是按ddmmyy的格式读入数据的,最长可读入10列。
(2)日期在SAS系统中的表示是用1960年1月1日至读入那一天之间的天数表示的。
如读入的日期在1960年以前,则用负数表示。
这种表示便于进行计算。
(3)输出时一般要用相应的格式FORMAT语句。
格式化输入还有一种方法是分组格式列表法。
当多少变量紧排在一起,它们都有相同的长度和类型,则用这种方式可简化输入。
如:
有X1,X2…,…X10十个字符型量的值紧挨在一起.每个量长度为3,则可用如下语句读入:
INPUT(x1-x10)($3.);
特殊的格式修饰符
(1)“:
”(冒号)格式修饰
从非空格开始读取对应变量的数据,直到遇到下一个空格或对应变量定义的长度已读满或数据行结束,此修饰符较适用于变量对应的数据长度大小不一的情形,防止列错读。
datastu;
inputid$address:
$20.zone$@;
cards;
001山东省青岛市四方区0532
002北京东城区010
003辽宁030
004天津滨海新区050
005四川成都080
006新疆建设兵团123
;
run;
procprint;
run;
(2)“&”格式修饰
SAS默认空格为数据字段分隔符,如果数据字段本身含空格需要读取,需用此修饰符,同时需确保该数据字段后面列的数据必须有两个或两个以上的空格分隔。
datastu;
inputid$address&:
$20.zone$4.@;
cards;
001山东省青岛市四方区0532
002北京东城区010
003辽宁030
004天津滨海新区050
005四川成都080
006新疆建设兵团123
;
run;
procprint;
run;
(3)“~“格式修饰
读取对应列数据包含单引号、双引号或分隔符的字符列。
datastu;
inputid$address~&:
$26.zone$4.@;
cards;
001"山东省,青岛市,四方区"0532
002"北京东城区"010
003"辽宁"030
004"天津滨海新区"050
005'四川成都'080
006新疆建设兵团123
;
run;
procprint;
run;
4、利用指针控制读数据的位置
当SAS系统从输入行读取数据时,可以用指针记录数据的位置。
例如,如果每个观测值有若十个输入数据行,并且我们想从第2行的第10列开始读入一数值,则指针的位置应置到第2行第10列。
(一)列指针控制
把指针移向规定的列。
有九种列指针控制方式:
@n;@指针变量;@(表达式);@‘字符串’;@字符变量;@(字符表达式);+n;+指针变量和+(表达式).
(1).绝对指针控制
为了把指针移到所要求的列,可在@后面跟着列号、变量或求值结果为列号的表达式。
例如语句:
INPUT@15SALES5.;
把指针移到第15列。
又如下面的INPUT语句:
DATAONE;
A=9;
INPUTNUM1-5@ANAME$10.;
CARDS;
(2).相对指针控制
利用“+”进行相对指针控制。
相对指针控制是把指针由当前位置移动过规定的列数。
例如语句:
INPUT@23DEP$4.+5W$1.;
把指针移到第23列,从后面的4列(23,24,25,26)中读取DEP值,此时指针在27列位置,然后再将指针继续向前移动5列,在第32列读取w的值。
(3).读取数据后列指针的定位
读完数据后指针的位置取决于所使用的输入方式。
当使用列表输入时指针移向被取值后的第2列,并从下一非空格列读下一数据。
例如,语句:
DATAA;
INPUTXY;
CARDS;
3754
;
RUN;
从第1至第2列读入x的值。
因为x值是采用列表输入,所以读完x值后,指针的位置是在第4列,即所取值后的第2列。
SAS系统从第4列开始读Y的值。
当使用列输入或格式化输入时,指针移到所取值后的第1列,并从此列开始计算下一变量的长。
例如,语句:
INPUTA3-4B;或INPUT@3A2.B;
A值所处的域在第4列结束(即使值本身仅占第3列),读完值后,指针移到第5列。
不论什么时候,一旦指针移向新的记录行,列指针都自动置为1。
(二)行指针控制
移动指针到指定的行数。
有四种行指针控制:
#n,#指针变量,#(表达式)及/。
在数据文件中,如果一个观测值的数据多于1行,则输入时要指出行号及每个观测值所占的行数。
可使用/表示移下一行。
#n表示观测值的第几行。
如一个观测值由3行数据组成,各数据间以空格分隔,欲输入第一行开始的5个数据NUM,A1-A3,再读入第二行开始的3个数据,则用如下语句:
DATAA;
INPUTNUM1A1-A3/NUM2B1-B3#3;或INPUTNUM1A1-A3#2NUM2B1-B3#3;
CARDS;
10011677890
1001899667
100199929647
10022767981
1002839065
1002100979543
;
PROCPRINT;
RUN;
由于一个观测值有3行数据,最后的#3表示将行指针移至最后一行(第3行),下一次执行INPUT语句时,指针就从此一行下跳一行,从下一纪录的第一行读起。
(三)行保持符(又称续行符)
(1)、行保持符使行指针保持在当前输入行。
有两种行保持说明符:
@和@@。
datascore;
inputclass$@;
ifclass='0001'thendo;
inputname$chimatheng;
outputscore;
end;
cards;
0001张三809087
0002李四908583
0001王五889095
;
run;
由于INPUT语句执行完后,下一次执行时,要跳至下一数据行去读。
单个@表示INPUT语句执行完后不换行,下一INPUT语句从下面接着读入。
(2)、为从一行读入多个观测值,应使用行保持符@@,限制读数据指针,使其保持在原行上,直到该行数据读完。
例如:
dataa;
inputxy@@;
cards;
3.162.95.834.94.17
;
procprint;
run;
第四节提供信息的几个语句
3.4.1LENGTH语句
当一个字符型变量长度超过或不足缺省值8时,一般可用该语句指出变量的长度。
例如:
DATAA;
LENGTHNAME$13;
INPUTNAMESEX$HW;
CARDS;
ZhangZhihuiF1.7052
ZhaoChangtaiM1.7355
;
由于NAME变量已在LENGTH语句中定义为字符型量,故INPUT语句中不再用$号作定义。
3.4.2LABEL语句
变量名由于不许超过8个字符长,或为了使用简单,所以有时变量名不能完全表达变量的意思。
比如:
用H表示身高,W表示体重等,而在输出时,常希望能把变量的意思表达完全。
这可以使用LABEL语句给变量一个标记,标记长可达40个字符。
它与变量值同时存于数据集中,它可以被许多SAS过程打印出来。
例如:
DATAD;
INPUTNUM$SEX$HW;
LABELH='HEIGHT'W='WEIGHT';
CARDS;
101M1.7261
102F1.6852
;
PROCPRINTLABEL;
RUN;
注意PRlNT过程的PROCPRINT语句中应加LABEL选择项,才能将数据集中已定义的变量的标记打印出来。
3.4.3FORMAT语句
在前面介绍的日期和时间量,输入时必须使用SAS已经定义的格式.读入SAS数据集后,日期是按从1960年1月1日算起的天数存储的,而时间量则是从清晨零时算起的秒数存储的。
输出时如不指定一种输出格式,输出的结果就无法理解。
这就必须在FORMAT语句中为这一变量赋以相应的日期、时间或日期时间输出格式。
譬如,考虑这个DATA步:
DATAEMPLO;
INPUTNAME$TDATE7.;
FORMATTWORDDATE.;
CARDS;
ZHONGLI15JAN84
LIUWEI03MAR85
;
PROCPRINT;
FORMAT语句把SAS输出格式WORDDATE.和变量T联系起来。
在实际应用中,经常利用FORMAT过程自己定义一些格式。
比如:
在对年龄进行分组,或者将输入时使用的代码在输出时还原成确切的意思。
我们以后将作专门讨论。
3.4.4MISSING语句
有时你可能想了解某些数值型数据缺项的原因。
你可利用26个大写字母中的任何一个表示缺项原因,所使用的字母要用一个MISSING语句来宣布:
在你录入的数据中的某些值代表数值型数据的缺项值。
MISSING语句格式如下:
MISSINGValues;
例如,对于一些调查数据,你可用代码表示缺项的原因。
假设字母“A”代表在调查时家中无人,字母'R'代表拒绝回答。
DATASURV;
MISSINGAR;
INPUTIDANSWER@@;
CARDS;
100121002R100311004A10052
;
MISSING语句规定,在录入的数据行中,值A和R被认为是特殊的缺项值,而不是无效的数值型数据值。
3.4.5注释语句
在编写程序时,如想在程序中加入一些注释以解释程序的作用或变量的意义,可使用注释语句。
在语句开头加一个星号,就表示该语句的内容是注释信息而不予执行。
例如:
*-example--;
data;
labeln="name"h="height";
inputnumn$h;
cards;
1001zhang31.73
1002li41.82
;
对于大段信息的注释,可用/*放在信息的开头,将*/放在往释信息的尾部。
在调试程序时,常将部分程序用"/*"和"*/"括起不执行,以加快调试程序的运行速度。
第五节建立数据集的另外几种途径
3.5.1从外部数据文件中读入数据
利用SAS处理数据,经常是从外部数据文件中读入数据,建立起一个数据集。
一般要求外部的数据文件必须是可以在操作系统下用TYPE命令打印出其全部内容的ASCII码文本