第五章SAS文件操作.docx
- 文档编号:6660833
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:16
- 大小:26.48KB
第五章SAS文件操作.docx
《第五章SAS文件操作.docx》由会员分享,可在线阅读,更多相关《第五章SAS文件操作.docx(16页珍藏版)》请在冰豆网上搜索。
第五章SAS文件操作
第五章SAS文件操作
第一节建立永久数据集
每次启动SAS系统后,SAS都要在硬盘上开辟一个临时存储区,称为WORK。
可利用DATA步将数据读入SAS系统存在悔时存储区中建起临时数据集。
SAS自动在给定的数据集名前加上WORK.来命名。
一旦退出SAS系统,临时集就被删除。
为了使建立的数据集能永久保存,就需要指定数据集存储的地方,给出路径,比如磁盘标号及子目录名。
这要由两个语句来实现:
5.1.1LIBNAME语句
在SAS数据集名称中不能使用真实的路径,必须用LIBNAME语句给路径名起个别名(称为库逻辑名)。
如想把数据集存在B盘上,则可用:
LIBNAMELB‘B:
’;
即给B盘起一库逻辑名LB(库逻辑名是由使用者任意起的)。
也就是说LB代替了B:
。
注意路径要用引号括起。
语句格式为:
LIBNAME库逻辑名‘路径’;
库逻辑名和路径的联系一直在起作用,直至用另一个LIBNAME语句改变这种联系或是会话结束。
一旦在一个LIBNAME语句中确定了路径,就可以读取或建立一个永久的SAS文件。
5.1.2DATA语句
为建立起永久数据集,必须在DATA语句中利用二级名命名数据集,例如:
DATALB.A;
即在B盘上建立起名为A的永久数据集文件。
为标识该文件是永久数据集,SAS系统自动在文件名后面加上.SSD后缀。
例如:
LIBNAMELB‘B:
’;
DATALB.AA;
INPUTNAME$SEX$AGEHW@@;
CARDS;
ZHANGSANM181.7876.5LILIF191.6550ZAOHUIM201.7268
;
LIBNAME语句将库逻辑名LB和磁盘名B:
联系起来,然后在DATA语句中,LB被用作永久SAS数据集的第一级名。
当这个程序执行时,SAS永久数据集AA.SSD被存于B:
盘中。
在同一个LIBNAME语句中可定义多个路径。
下面的DATA步从一个路径中读取一个永久的SAS数据集SCORE.SSD,并且在另一个路径中建立一个永久数据集STUTEST.SSD。
用一个LIBNAME语句定义两个路径:
LIBNAMESB'B:
',SA'A:
';
DATASB.STUTEST;
SETSA.SCORE;
KEFPNUMS1-S5;
一旦在磁盘上建立起了SAS永久数据集,今后再要处理这个数据集中的数据时,只要将该数据集磁盘所在的驱动器名及所在的子目录名再一次用LIBNAME语句加以定义就可直接处理数据集中的数据。
例如:
LIBNAMEL'B:
';
PROCPRINTDATA=L.AA;
就可将B盘上的AA.SSD永久集中的内容打印出来。
第二节数据排序
在整理数据集时经常要对数据进行排序。
比如,按成绩将学生成绩数据集中的数据进行排序。
排序要调用SORT过程,用BY语句指明按哪一变量值进行排序。
例:
建立学生成绩数据集SCORE:
(yp35.sas)
DATASCORE;
INPUTCLASNUMSEX$S1-S3@@;
TOT=SUM(OFS1-S3);
CARDS;
对SCORE集中数据按总成绩TOT值排序:
PROCSORT;
BYTOT;
PROCPRINT;
SORT过程所用的语句是:
PROCSORT[选择项];
BY[DESCENDING]变量...;
5.2.1PROCSORT语句
该语句调用SORT过程,SORT过程按BY变量的值对数据集排序。
如果要对非当前数据集进行排序,就要在PROC语句中用DATA指出要排序的数据集名。
排序后产生一新数据集,数据集名可在PROCSORT语句中用OUT=指出。
若缺省,则排序后的输出数据集覆盖原始数据集。
例如:
PROCSORTDATA=SCOREOUT=CS1;
BYCLAS;
对数据集SCORE按CLAS变量的值进行排序,结果存在CS1集中。
5.2.2BY语句
BY语句指出用以排序的变量名,数据集中各观测值是按BY变量值的升序排序的。
如果需要按BY变量值降序排列,则在变量名前要用DESCENDING指出。
如BY语句中给出多个变量,则先按前一变量值进行分组,在各组中再按后一变量值排序。
例如:
PROCSORTDATA=SCOREOUT=CS2;
BYCLASDESCENDINGTOT;
PROCPRINT;
第三节分组控制
在DATA步中,有时需要按某一变量值分组进行某种操作,分组操作是在对数据集按变量值排序后,再在数据步中用BY语句控制SET,MERGE,UPDATE语句的操作,操作时自动产生一组特殊的变量。
BY语句必须放在SET,MERGE或是UPDATE语句之后。
5.3.1BY语句
BY语句的格式为:
BY[DESCENDING]变量..[NOTSORTED];
这里:
变量:
命名为数据集排序所用的每一个变量。
变量表定义了数据集的BY组。
DESCENDING:
说明数据集是根据BY语句中DESCENDING字后所跟的变量进行递减排序。
NOTSORTED:
指出具有相同BY变量值的观测值被组合到一起,但是没有必要对BY变量值按照字母或数字的顺序进行排序。
NOTSORTED选择项可出现在BY语句的任何地方。
例如语句:
BYDESCENDINGXY;
说明数据集是按照X值的递减顺序进行排序,而在每一个X值的观察中。
又是按照Y值递增的次序进行排序。
语句:
BYDESCENDINGXDESCENDINGY
说明数据集是按照X和Y的值进行递减排序。
如果数据集的观测值中具有DAY变量,且DAY变量是一周中每一天三个字符的缩写词。
在数据集中,所有带有相同DAY值的观测值被组合到一起,但观测值是按照日历的顺序而不是按照字母的顺序排列。
可使用语句:
BYDAYNOTSORTED;
例如:
DATAB;
SETA;
BYDAYNOTSORTED;
如果DESCENDING和NOTSORTED都未指定,数据集中的观测值就会按照BY变量的值进行递增排列。
5.3.2分组标识变量
当用BY分组处理数据集时,可能想识别出某一分组的第一个或最后一个观测值。
SAS系统通过对BY语句中的每一个变量建立两个变量FIRST.byvar和LAST.byvar,来对所有分组中的第一个和最后一个观测值进行记录。
如,若在BY语句中,含有变量CLAS和SEX,SAS系统就会建立这些变量FIRST.CLAS,LAST.CLAS,FIRST.SEX,LAST.SEX。
FIRST.byvar和LAST.byvar可用于DATA步中的可编程语句中,但是这些变量不能加到已建立的数据集中。
如果某一观测值是按byvar值分组的第一个,则其FIRST.byvar的值为1。
而该分组中的所有其它观测值的FIRST.byvar变量的值为0。
如果某一观测值是其所在分组中的最后一个,则其LAST.byvar的值为1,而除最后一个之外的所有观测值的LAST.byvar变量的均值为0。
例如:
PROCSORTDATA=SCOREOUT=STU;(yp37.sas)
BYCLASSEX;
DATASTUDENT;
SETSTU;
BYCLASSEX;
DROPS1-S3;
IFFIRST.CLASTHENPUTNUM;
数据集STUDENT中,各FIRST.byvar和LAST.byvar变量的值如下:
First.by_variableLast.by_variable
CLASNUMSEXFIRST.CLASFIRST.SEXLAST.CLASLAST.SEX
11002F1101
11001M0100
11004M0011
21003F1101
21005M0111
第四节数据集连接
利用SET语句还可以将两个或更多的数据集一个接一个地连在一起,形成一个单独的大的数据集。
5.4.1变量相同
在最简单的情况下,所有的输入数据集包含相同的变量集,它们也是新数据集中的变量。
例如:
有两个数据集Y9l和Y92,每个包含相同的变量。
一个由1991年的数据组成,另一个是由1992年的数据组成,要把它们连接成一个单独的数据集,包括有1991年和1992年的所有观测值,可用如下语句:
DATABOTHYEAR;
SETY91Y92;
在新的数据集中的观测值个数是Y9l和Y92两个数据集中观测值个数的和。
在数据集BOTHYEAR中,观测值的次序是Y91的所有观测值后跟Y92的所有观测值。
新数据集中的变量与旧数据集中的一样。
5.4.2变量不同
如果在SET语句中的各数据集包含有不同的变量集,新数据集将包括所有的变量。
从某个数据集获得的观测值中,对于该数据集中没有的变量将用缺省值填充。
例如:
DATAD1;(yp38.sas)
INPUTDEPBC@@;
CARDS;
157279l34
;
DATAD2;
INPUTDEPBD@@;
CARDS;
120252171436035
;
DATAD3;
SETD1D2;
PROCPRINT;
5.4.3交叉连接
如果两个数据集D1和D2已经按DEP值排过序,在连接两数据集时想将有相同DEP值的数据连在一起,可使用BY语句进行交叉连接。
例如:
PROCSORTDATA=D1OUT=SORTD1;(yp39.sas)
BYDEP;
PROCSORTDATA=D2OUT=SORTD2;
BYDEP;
DATAD1D2;
SETD1D2;
BYDEP;
第五节数据集合并
将两个或多个SAS数据集中的观测值合并成一个新数据集中单个的观测值使用MERGE语句。
SAS系统合并观测值的方法取决于MERGE语句是否伴随BY语句。
MERGE语句的格式是:
MERGE数据集表
数据集表:
命名两个或多个已存在的SAS数据集。
每当MERGE语句执行时,SAS系统从这些数据集中读取观测值。
在MERGE语句中出现的数据集名可多至50个。
5.5.1一对一合并
不使用BY语句时,MERGE语句是将一个数据集的第一个观测值和另一个数据集的第一个观测值相合并,第二个观测值和另一个数据集的第二个观测值进行合并,以此类推。
新数据集中观测值数为MERGE语句中所列出的各数据集中观测值数的最大者。
如果某个数据集的观测值用完,则该数据集观测值各变量的值由缺失值代替去和其它数据集的观测值合并在一起。
如果一个变量在多个数据集中出现,则在新的数据集中,该变量名只出现一次。
且该变量的值为在MERGE语句中列在最右边的有相应变量数据集中的值。
例:
假设有两个数据集,它们观测值的数目相同但含有不同的变量,数据集student含有学号、姓名和性别,另一数据集test含有各学科成绩。
若想将STUDENT数据集中的观测值和TEST数据集中观测值一对一合并,新数据集含有的观测值数为4,但是变量个数为两个输入数据集变量个数的总和。
(yp40.sas)
一对一合并是依靠观测值序号OBS合并的,如果对于同一物体的两个数据集中的观测值序号不同,则不能用此法合并。
5.5.2匹配合并
如果想将两个或多个含有部分相同变量的数据集的观测值合并起来,就要在MERGE语句后使用BY语句。
为了实现匹配合并,对于所有要合并的数据集要求它们至少有一个变量是相同的,并且每个数据集都应按这些变量排过序。
BY语句被用来标识匹配变量。
当有不匹配的BY值出现时,SAS系统在处理有较高BY值的观测值之前,先处理有较低的BY值的所有观测值。
FIRST.和LAST.变量用来探测BY分组的开始和结束,因此能使你在一个BY分组中控制是否输出、删除、或计数多个观测值。
1.在一个数据集中多个观测值具有相同BY值
匹配合并操作将从观测值具有当前BY值的每一个数据集中合并所有数据。
这就是说,如果一个数据集有一个以上的观测值具有相同的BY值,匹配合并操作将输出每一个观测值。
BY组中的观测值与每一个数据集中与其具有相同BY值的观测值合并,即BY组中的第一个观测值相合并,第二个观测值与第二个结合,……等依此类推。
当一个输入数据集用尽一个BY组中的观测值时,在该BY组中的最后一个观测值的值被保留且用来同其它数据集的该BY组中的剩余观测值的值合并。
如果一个输入数据集不包括某一BY组中的任何观测值,则该数据集提供缺项值给新数据集。
结果数据集BY组中的观测值数与各数据集的BY组中最大数目相等。
因此,在新的数据集中的观测值总数是所有输入数据集的每一个BY组中观测值最大数目之和
2.在多个数据集中具有同名变量
如果一个变量而不是BY变量,出现在被合并的多个数据集中,则仅有一个该名变量可出现在新数据集中。
在新观测值中的该变量的值是来自MERGE语句最后提到的有该变量的数据集中的值。
例如:
有两个数据集,数据集PERSON包括有变量NAME和SEX,数据集PLACE包括有变量NAME,CITY,和REGION。
数据集PERSON与PLACE有一个公共变量NAME。
下面这些步执行了匹配合并操作(yp41.sas)。
PROCSORTDATA=PERSON;BYNAME;
PROCSORTDATA=PLACE;BYNAME;
DATARESULT;
MERGEPERSONPLACE;
BYNAME;
PROCPRINT;
TITLE'DATASETRESULT';
第六节输出信息
在SAS程序执行时,常常需要将一些信息写到SAS日志中、写入SAS的输出文件中;或写入在一个FILE语句中指定的任何一个文件中。
在数据步中,输出信息使用PUT语句。
一般的PUT语句格式是:
PUT[说明]…;
这里,“说明”描述了如何将一个变量的值或一个字符串写入输出行。
PUT语句能写入变量的值、文本字符串。
通过使用命名输出,变量值能被用变量名来标识。
利用PUT语句的说明,你能列出被写入的项目并描述它们的格式。
与INPUT语句相似,变量值有三个基本输出形式:
列、列表(或自由形式)、或者格式形式。
还可以使用指针控制方式输出。
5.6.1列表形式
在PUT语句中,简单地按你要写入的顺序列出变量。
PUTNAMEWEIGHTSEX;
输出时,各变量值按其长度依次列出。
5.6.2列形式
在变量名后面给出输出列的范围。
例如:
PUTNAME6-15WEIGHT17-19;
5.6.3格式形式
在变量名后面规定一种输出格式。
例如:
PUTDATEMMDDYY8.TIMEHHMM5.;
能在一个PUT语句中综合利用这些输出形式,按给出的顺序将每一项写入。
例如:
PUTNAME'WEIGHS'WEIGHT17-19'ON'DATEMMDDYY8.;
5.6.4指针控制输出
1.绝对指针
使用@N,@变量,@表达式置输出列指针位置。
2.相对指针
使用+n,+变量,+表达式将指针从当前位置向前移动。
PUT语句执行后,输出位置指针移到下一行首部。
如果执行完一个PUT语句而不想换行,下一次PUT语句执行时将接着前一输出行后输出,可在PUT语句末尾使用续行符@。
一个没有任何说明的PUT语句称为空PUT语句。
空PUT语句释放一个已被尾部带有@的PUT语句保持的输出行,将指针移至下一行首部。
假设你有一个命名为DEXT的SAS数据集,其中包括一组孩子的敏捷测验分析。
在数据集中每一个观测值包括3个变量:
CHILD,孩子的名字;SCORE,敏捷得分数;和TYPE,哪只手(左或右)。
每一个孩子有2个观测值:
一个右手得分数和一个左手得分数。
在同一个输出行,你要分别打印出左手和右手的得分数。
DATA_NULL_;
SETDEXT;
BYCHILD;
IFFIRST.CHILDTHENPUTCHILD@;
IFTYPE='LEFT'THENPUT@25SCORE4.2@;
ELSEIFTYPE='RIGHT'THENPUT@35SCORE4.2@;
IFLAST.CHILDTHENPUT;
在这个例子中,如果观测值对CHILD是第一个,则孩子的名字被写入。
指针保持在同一行上直到左或右手的得分数也被写入。
指针仍然在同一行上,下个记录被从DEXT读来且得分数被写入,当这记录对于一个孩子来说是最后一个时,通过最后一个PUT语句,此行被释放,指针移至下一行。
注意在PUT语句中指定续行符@,则为下一个PUT语句的执行保持当前行,即使这个数据步开始另一次执行也如此。
续行符@保持当前输出行不变,除非遇见下面的情况:
Ø一个没有尾随符@的PUT语句,如前一例子所示。
Ø被当前的LINESIZE=的值所规定的当前行末尾。
Ø数据结束。
Ø一个指定了_PAGE_的PUT语句。
PUT_PAGE_:
该语句向前移动指针到新页的第一行,当行数超过系统的页长参数PAGESIZE的值时,SAS系统自动开始一个新页。
如果当前输出文件是一个打印文件,_PAGE_产生一个输出行,它包括回车控制符。
例如,在打印完一个城市的最后二个观测值之后,要换到一个新页的第一行继续输出,程序如下:
DATA_NULL_;
SETSTATES;
BYCITY;
FILEPRINT;
PUTNAME1-10@15ADDRESSCOMMA9.;
IFLAST.CITYTHENPUT_PAGE_;
当LAST.CITY值为1时,PUT_PAGE_移动指针到新页的第一行。
第七节FILE语句
FILE语句用来规定当前的输出文件。
如果不用FILE语句规定,那么PUT语句将其输出写到SAS日记中。
FILE语句选择项可以使你控制如何去写一个输出文件。
你可以用FILE语句选择项来定义记录当前行列指针位置的变量及说明在每一新输出页的开始所要打印的内容。
当使用FILE语句时,还有必要使用其他相关的语句,比如PUT,RETURN等。
PUT语句建立并控制一输出行到最后一个FlLE语句所命名的外部文件。
FILE语句的格式是:
FILE文件说明[选择项]
1)文件说明:
标识一个文件。
文件说明有下列几种形式:
‘filename’说明一个文件的完整名字。
文件名括在单引号中。
LOG把由PUT语句产生的输出行写到SAS日志中。
在DATA步每次执行的开始,SAS系统置缺省文件逻辑名为LOG。
PRINT把PUT语句产生的输出行及SAS过程产生的输出写入标准的SAS打印文件中(即在OUTPUT窗口中)。
2)使用下列选择项控制输出行如何被写入到当前的输出文件中:
COLUMN=variable定义一个变量,它的值表示指针的当前列的位置。
SAS系统自动地将列的位置赋给COLUMN=变量。
LINE=variable定义一个SAS变量,它的值表示由N=选择项所规定的一组输出行中当前行的相对行号(见下面介绍)。
因而,这个变量取值范围是由1到N=选择项所规定的值。
如果没有规定,则LINE=变量的值为1。
LINESIZE=value|LS=value为报表设置的每行中列的最大值和数据文件中最大的记录长度。
如果用PUT语句试图写入的行的长度超过了由LINESIZE一选择项所规定的长,则SAS系统把一行写成两个或更多个单独的记录。
例如,如果LINESIZE=的值是80,下列PUT语句将写成三个单独的记录:
PUTNAME1-50CITY71-90STATE91-104;
NAME值位于第一个记录中,CITY位于第二个,STATE位于第三个。
LINESIZE=的缺省值取决于文件的类型。
N=PAGESIZE|PS|N=value给定行指针变化的范围。
N:
选择项的值可以是数字或关键字PS。
例如,当N=的值为3时,可以把指针由l行移至3行并回到1行,1,2,3行有效直到把指针移至4行;此时行4,5,6变为有效,以此类推。
当移动到PAGESIZE=所规定的数值或遇到一个PUT_PAGE_语句时,指针向前移至新的输出页的第一行。
如果当前输出文件是一打印文件,N=的值必须是1或PAGENZE。
下面的作业将产生一个四栏的电话号码薄;每一栏含有姓名和电话号码两项内容。
数据集PH中有NAME和PHONE等变量。
DATA_NULL_;
FILEPRINTN=PS;
DOC=1,30,60,90;
DOL=1TO50;
SETPH;
PUT#L@CNAME$20.+1PHONE$8;
END;
END;
PUT_PAGE_;
N=PS选择项使页中各栏的所有行输出都可用指针控制。
SET语句读一个包含姓名和电话号码的SAS数据集。
L和C变量标识着指针的当前行和列。
PUT语句是在当前行(L)的当前列(C)上写入NAME和PHONE。
L的值按1递增直到50。
当内层DO循环完成后,C增至30将指针移至第二栏,写入另外50个。
当外层DO循环结束,则完成每栏有50个名字和电话号码的四栏输出。
此时,执行PUT_PAGE_语句换页。
下一次执行DATA步时,C和L的值又都从1开始。
第八节OUTPUT语句
OUTPUT语句告诉SAS系统将当前的观测值写入正建立的数据集中。
OUTPUT语句格式是:
OUTPUT[数据集名表]…;
这里,数据集名表是任意给出的数据集名,当前观测值就写入这个数据集中。
该语句可给出多个数据集的名字。
所有给出的数据集名也一定要在DATA语句中出现。
当不给出数据集名字时,当前的观测值被写到这个程序步正建立的所有数据集中。
简单的SAS数据步不必有0UTPUT语句,因为在SAS返回到数据步开始进行下一个运行之前,观测值会自动输出。
当你要以下列形式控制观测值输出时,OUTPUT语句是有用的:
Ø从输入的每个数据行中,创建两个或更多的观测值。
Ø从一个输入的数据文件中,创建一个以上的SAS数据集。
Ø结合几个输入的观测值成为一个观测值。
若在数据步的程序中有OUTPUT语句时,仅仅当OUTPUT语句被执行时,SAS才将一个观测值写到SAS数据集中,而没有自动的输出产生。
5.8.1从一个输入行中创建几个观测值
例有一批学生考试成绩,每行有学号和三个某科的考试分数,为用SAS过程处理这批数据,要求每一学号后仅有一个成绩,即对于每一个输入行,要产生三个观测值。
每一个新的观测值应包括学号和一个考试分。
DATAREPEAT;(yp45.sas)
INPUTNUMMEASURE1-MEASURE3@@;
DROPMEASURE1-MEASURE3;
MEASURE=MEASURE1;
OUTPUT;
MEASURE=MEAS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 SAS 文件 操作