《第6章创建数据集.ppt》由会员分享,可在线阅读,更多相关《第6章创建数据集.ppt(89页珍藏版)》请在三一办公上搜索。
1、第6章 创建数据集,蔡德利TsaiD黑龙江八一农垦大学植物科技学院,本章主要内容,概述Data Step加工数据集PROC Step,概述,SAS对数据的管理通常,有两种:SAS数据集(data set)SAS数据视图(data view),概述,概述,SAS数据视图只有描述部分,没有数据部分,但描述部分包含了足够的信息以找到保存在其他文件中的数据;数据视图减少了维护费用。如果改变了源数据,数据视图将随着改变。可由SQL、ACCESS和DATA Step产生。,概述,Libname命令作用:指定库标记。一般格式:Libname 库标记 文件夹位置 选项;例如:指定目录“G:SAS统计分析SAS
2、”为库标记MySASLib Libname MySASLib G:SAS统计分析SAS;,概述,SAS语言是一种专用的数据管理、分析语言,它提供了很强的数据操作能力。表现在它可以轻易地读入任意复杂格式的输入数据,并可以对输入的数据进行计算、子集选择、更新、合并、拆分等操作。另外,SAS系统还提供了用来访问其它数据库系统如Sybase、Oracle的接口,访问各种微机用数据库文件如FoxPro、Excel的接口及向导,并提供了一个SQL过程来实现数据库查询语言SQL的功能。,概述,SAS语言的自编程计算功能主要在数据步实现。一个SAS数据步相当于一个单独运行的程序。但是,SAS语言又是一个专用数
3、据处理语言,所以SAS数据步有其他语言所没有的特点。,概述,例如/*SasProg0601.SAS*/data a;put x=y=z=;input x y;z=x+y;put x=y=z=;cards;10 20 100 200;run;,概述,运行后在Log窗口显示x=.y=.z=.x=10 y=20 z=30 x=.y=.z=.x=100 y=200 z=300 x=.y=.z=.NOTE:The data set WORK.A has 2 observations and 3 variables.,概述,程序的运行流程:1.DATA语句标志了数据步开始,并指定了数据步结束时要生成的数据
4、集名字为A(实际是WORK.A)。2.第一个PUT语句要输出变量X、Y、Z的值,但它们还都没有定义,所以显示为三个缺失值。3.INPUT语句,从CARDS语句后面的数据行中读取变量X的值10,变量Y的值20。4.下一个赋值语句计算变量Z的值得到30。因此,LOG 中的第二行输出显示三个变量的值分别为10、20、30。,概述,5.从CARDS语句开始到空分号行的各行是非执行的,程序运行到RUN语句,发现这是本数据步的最后一个语句,按一般的程序语言的规则,程序到这里就应该结束了,但是,SAS是一个专用数据处理语言,如果按一般语言的规则,程序中的第二行数据(100 200)就不能被读入。所以,这个程
5、序运行到RUN语句后,把读入的观测(这是第一号观测)写入输出数据集,6.流程又返回到DATA语句后的第一个可执行语句开始执行,并先把所有的变量置初值为缺失值。于是,第一个PUT语句的结果显示三个变量均为缺失值,而不是上一步的10、20、30。,概述,7.INPUT语句又从数据行中读入下一个观测,把变量X、Y赋值为100、200。读取位置由运行时设置的一个数据指针指示。然后计算变量Z的值得300。于是PUT语句输出的X、Y、Z值分别为100、200、300。8.流程跳过CARDS语句到空语句,到数据步结尾,把第二号观测输出到数据集。9.再返回到数据步开头,把变量值赋初值为缺失值,所以第一个PUT
6、语句输出的三个变量值为缺失值。10.运行到INPUT语句,应该读入下一个观测,但是查询数据指针发现已经读完了所有数据,所以本数据步结束,并把两个观测写入数据集WORK.A中。,概述,从这个例子可以看出SAS数据步程序和普通程序的一个重大区别:SAS数据步如果有数据输入,比如用INPUT、SET、MERGE、UPDATE、MODIFY等语句读入数据,则数据步中隐含了一个循环。,数据步因为有这样一个隐含循环,所以也提供了用来查询某一步是第几次循环的特殊变量 _N_,它的值为数据步循环计数值。,概述,Data Step 流程:,概述,Data Step,第一种方式语法:DATA 数据集名;Input
7、 变量列表;Cards;,DATA、INPUT和CARDS三个关键词缺一不可。,注意:CARDS语句在INPUT语句之后,Data Step,DATA语句作用:标志数据步的开始。命名将要创建的SAS数据集。CARDS语句作用:用于直接输入数据,标志着数据块的开始,Data Step,直接输入SAS数据:/*SASProg0602.sas*/data temp;input x y;cards;34 56 78 90 35 67 89 10 23 65 77 45;run;,SAS默认按列来分隔变量,可是这里只有两个变量,输成两列数据太长,因此加上,SAS见到这个符号,在按变量名依次读取完数据后,
8、不是跳到下一行,而是继续在该行读数据,直至本行结束或到达分号为止。,数据集Work.temp输入变量x,y,的作用是不换行,连续输入,Data Step,第二种方式语法:DATA 数据集名;Infile 文件名Input 变量列表;,用INFILE语句指定了一个外部数据文件,所有需要输入的数据存放在该文件中,从而取代了第一种方式中的CARDS语句及其下列的一连串数据,当数据比较多的时候,用第二种方式可以使程序看上去显得比较简洁。,注意:INFILE语句在INPUT语句之前,Data Step,INFILE语句作用:确定一个包含原始数据的外部文本文件。一般格式:INFILE 外部文件名 opti
9、ons;选项(options)可以有选择地读取外部文件中的记录:FirstOBS=n1表示从第n1条记录开始读取OBS=n2表示共读取n2条记录,Data Step,从外部文件读入数据示例:/*SASProg0603.sas*/data temp;Infile G:SAS统计分析SASDatatemp.dat;input x y;Run;,Data Step,INPUT语句作用:读入由语句指定的数据列。为相应的数据域定义变量名。确定变量的读入模式。一般格式:INPUT 设定1设定n|;,Data Step,设定的四种格式:List:变量名$:输入格式Column:变量名$始列-终列Format
10、ted:指针 变量名 输入格式(指针:n|+n)Named:变量名=$始列-终列输入换行控制:不换行等待下一个Input 语句:形成输出记录时输入也不换行,Data Step,INPUT语句-List格式(自由格式),INPUT 变量名$:输入格式 变量名$:输入格式;,说明:源文件中字段间至少有一个空格或特定字符分隔;字段只能按序输入;缺失值必须用句点(.)表示;字符变量的值不能含有空格,长度一般不超过8。,Data Step,/*SASProg0604.SAS*/data c9501;input name$sex$math Chinese;cards;李明 男 92 98张红艺 女 89
11、106王思明 男 86 90张聪 男 98 109刘颖 女 80 110;run;,按顺序列出每个观测的各个变量名,中间用空格分开。变量如果是字符型,需要在变量名后加一个$符号,$符号可以与变量直接相连,也可以间隔一个空格。,Data Step,/*SASProg0605.SAS*/data a;input date yymmdd8.sales;format date yymmdd10.;cards;56-6-13 110067.12.15 120078 10 2 1300891001 140019960101 150020020901 1600;run;proc print;run;,需要按
12、格式输入,可在变量名后加格式名,最常用的是输入日期数据;本例日期占8列,不足用空格补足;日期在SAS中是按数值存储的,要显示日期值,必须设置输出格式,本例用format语句。,Data Step,/*SASProg0606.SAS*/data b;input date yymmdd10.sales;format date yymmdd10.;cards;56-6-13 110067.12.15 120078 10 2 1300891001 140019960101 150020020901 16001956-6-13 11001967.12.15 12001978 10 2 130019891
13、001 140019960101 150020020901 1600;run;proc print;run;,YYMMDD六位数的日期YYYYMMDD带世纪格式的日期YYYYMMDD10.带世纪的,中间有分隔符或无分隔符的日期,Data Step,/*SASProg0607.SAS*/data b;input sales date:yymmdd10.;format date yymmdd10.;put date=;cards;1100 56-6-131200 67.12.15;run;,如果日期变量不在第一项,并且与前一项用空白分隔,可以在格式名yymmdd10.前面加一个冒号表示允许日期值前
14、面的空白。“变量名:格式”表示读取当前第一个非空列开始的值,并用指定的输入格式转换。,Data Step,INPUT语句-Column格式,INPUT 变量名$始列-终列 变量名$始列-终列;,说明:源文件中各变量所在位置必须是规则的;每个变量按指定的始列、终列读入;字符变量的长度不受缺省值的限制(但200);变量值可含空格,变量输入次序可以是任意的;任何字段或其部分可重复读入。,Data Step,一个典型原始数据文件(overseas.dat)内容:,Data Step,练习:用Column格式读入文件overseas.dat,创建SAS数据集名为mylib.column,最后查看该数据集
15、的内容。/*SASProg0608.sas*/data mylib.column;infile E:Sas统计分析SasDataoverseas.dat;input date$1-9 dest$10-12 boarded 13-15;run;proc print data=mylib.column;run;,Data Step,/*SASProg0609.SAS*/data c9502;input name$1-7 sex$8-9 math 11-12 Chinese 14-16;cards;李明 男 92 98张红艺 女 89 106王思明 男 86 90张聪 男 98 109刘颖 女 80
16、 110;run;,将SasProg0603的例子改为数据上下行对齐,然后用Column格式读入。,Data Step,/*SASProg0610.SAS*/data pids;input year 7-10 mon 11-12 day 13-14;cards;110103197512092232110101196902150059;run;,Column不要求数据项之间分开,所以经常用来输入紧缩格式的数据。比如,输入一批身份证号,从中提取生日的年、月、日信息。,Data Step,INPUT语句-Formatted格式,INPUT 指针控制符 变量名$输入格式;,说明:适合读入含有不标准数据
17、的文件Formatted 格式中可以:将输入指针移到数据域的开始位置;定义变量名;定义输入格式,Data Step,指针控制符:n 表示将输入指针移动到第n列;+n 表示将输入指针向后移动n列。如:input lname$15.21 fname+2 sex$1;,Data Step,练习:用Formatted模式读入文件overseas.dat。创建后的SAS数据集名为mylib.Format。/*SASProg0611.sas*/data mylib.format;infile d:overseas.dat;input 1 date$9.10 dest$3.13 boaeded 3.;run
18、;proc print data=mylib.format;run;,Data Step,DATA步中设定变量属性的语句:,Data Step,12234.12,comma8.2,dollar8.2,8.2,12234.12,12234.12,12234.1,12234,12234.1234,Data Step,SAS内部该日期等于距离1960年1月1日的天数,20OCT97,ddmmyy8,mmddyy8,实际存储数值13807,20/10/97,10/20/97,20/10/97,Data Step,变量的属性:(1)字符型还是数值型:Input在读入字符型时在变量后要加$符号。(2)变量
19、标签(Label):可以给变量加一个长度不超过40个字符(汉字不超过20个)的标签,标签可以用在报表中。(3)变量存储长度(Length):数值数据一般长度为8字节,也可以对取值较小的数值规定较小的长度以节省存储空间;字符型变量的缺省长度为8字节。,Data Step,变量的属性:(4)变量的输出格式(format):指定如何显示变量的值。(5)变量的输入格式(informat):指定如何把外部数据转换为SAS数据。数据步中的Attrib语句可以指定这些属性,格式为:Attrib 变量名 属性名=属性值;,Data Step,/*SASProg0612.sas*/data sales;ATTR
20、IB name LABEL=姓名 LENGTH=$10 date LABEL=日期 FORMAT=yymmdd10.INFORMAT=mmddyy10.amount LABEL=金额 FORMAT=10.2;input name$1-10 date amount;cards;张鹏 10/15/1998 2000李志明 1/3/99 1500王敏 11/5/99 3000;run;proc print noobs label;run;,可以同时指定多个变量的属性;可以为一个变量同时指定多个属性。,加工数据集,用Set语句复制数据集/*SASProg0613.sas*/data c9501;set
21、 mylib.youth;run;,把mylib.youth复制为work.c9501该程序流程也隐含着一个循环,其中的set语句是读取观测的语句。,加工数据集,修改数据集/*SASProg0614.sas*/data c9501;set mylib.youth;if height170 then height=170;run;,原数据集中赵大可身高172,修改后为170;,加工数据集,使用Keep语句指定保留数据集中的变量,Drop语句指定丢弃数据集中的变量。/*SASProg0615.sas*/data c9501;set mylib.youth;Keep name height weig
22、ht;run;,生成新数据集,保留原数据集中name、height、weight三个变量;,加工数据集,/*SASProg0616.sas*/data c9501;set mylib.youth;drop age,sex;run;,丢弃age、sex变量,与上例作用相同;用这种方法可以取得数据集的某些列的子集。,加工数据集,/*SASProg0617.sas*/data c9501a;set c9501;if height150 and weight50;run;,也可以取得数据集的某些行的子集。身高大于150cm,并且体重大于50kg的观测。这里if语句不同于分支语句,它没有then部分。用
23、于取出满足条件的行,形成子集。,加工数据集,利用If-then结合Delete筛选数据集/*SASProg0618.sas*/data c9501;set c9501;if height150 then Delete;run;程序执行后,身高小于150的记录均被删除。,加工数据集,在用Set语句引入数据集时,可以给数据集加选项,格式为:数据集名(数据集选项);选项包括:Keep=:表示引入时只要指定的变量;Drop=:表示不引入指定的变量;Obs=:表示读取观测时,读到指定的序号为止;FristObs:表示从指定的序号开始读起,不读取序号之前的观测。,加工数据集,/*SasProg0619.S
24、AS*/data huge;array x(10);do i=1 to 1000000;do j=1 to 10;x(j)=normal(0);end;output;end;drop i j;run;data new;set huge(obs=100 keep=X1 X2);run;,产生一个10个变量,1百万个观测的数据集work.huge;从中复制前100行和两个变量,形成新数据集work.new。,加工数据集,拆分数据集/*SasProg0620.SAS*/data datam dataf;set mylib.youth;select(sex);when(男)output datam;w
25、hen(女)output dataf;otherwise put sex=有错;end;drop sex;run;proc print data=datam;run;proc print data=dataf;run;,把Mylib.youth数据集中的男生放到work.DataM中,将女生放到work.DataF中。Output是一个可执行语句,它强制当前观测写入到语句指定的数据集中。,加工数据集,纵向合并数据集几个结构相同的数据集上下地合并在一起;比如:Data Classes;set Class1 class2 class3 class4;Run;,加工数据集,加工数据集,/*SasPr
26、og0621.SAS*/data new;set datam(in=male)dataf(in=female);if male=1 then sex=男;if female=1 then sex=女;run;,将前例拆分的男生、女生两个数据集合并;为了指示观测来自哪一个小数据集,在Set语句数据集名后可加一个小括号,里面加上“In=变量名”,该变量取1时表示观测来自该数据集,取0时不是来自该数据集。,加工数据集,横向合并数据集两个(或多个)数据集如果包含了同样一些观测的不同属性(变量),且各个数据集的观测顺序是一一对应的,则可以通过Merge语句合并到一个新数据集;比如:data new;me
27、rge c9501u c9501v c9501w;run;,加工数据集,如果顺序不对应,则合并结果不正确。所以横向合并一般采取按关键字合并的方法。即把每个数据集按照相同的、能唯一区分各个观测的一个(或几个)变量排序,然后用by语句和Merge语句,使原来观测顺序不一致或个数不同的数据集正确合并。,加工数据集,加工数据集,/*SasProg0622.SAS*/data c9501x;set mylib.youth;keep name sex;run;data c9501y;set mylib.youth;keep name height weight;run;proc sort data=c95
28、01x;by name;run;proc sort data=c9501y;by name;run;data new;merge c9501x c9501y;by name;run;proc print;run;,把mylib.youth拆分为包含name、sex的数据集c9591x;把mylib.youth拆分为包含name、height、weight的数据集c9591y;按关键字横向合并。Sort是排序过程。,Proc Step,SAS程序的过程步表示一个处理过程,如排序、T检验、方差分析等等。过程步以关键字proc开始,后面紧跟着过程名,用以区分不同的程序步,并以关键字run结束。,一般
29、格式如下:proc 过程名 选项列表;(其它语句);(其它语句);run;,Proc Step,SAS程序中涉及的过程多达数百种;实现统计功能时常用的过程也有数十种;现将最为常用的过程名称及其所能实现的功能列入下表。,Proc Step,Proc Step,对SAS文件进行操作的datasets过程:功能:将SAS文件从一个库中拷入另一个库中;对SAS文件进行重命名;修复损坏的SAS文件;删除SAS文件;列出某一SAS库中所有的SAS文件;列出一个SAS数据集的属性,如最后修改时间、数据是否压缩、数据是否索引等;对SAS文件进行设置密码的操作;向SAS数据集添加记录;对SAS数据集的属性以及数
30、据集内变量的属性进行修改;创建或删除SAS数据集的索引;创建并管理SAS数据集的核查文件;创建或删除SAS数据集的完整性规则。,Proc Step,Datasets格式:proc datasets;age 当前文件名 相关文件名列表;append base=数据集名;audit 文件名;initiate;change 旧文件名1=新文件名1;contents;copy out=库标记;exclude 文件名;(该语句只能在copy语句后出现,不能和select语句同时出现)select 文件名;(该语句只能在copy语句后出现,不能和exclude语句同时出现)delete 文件名;excha
31、nge文件名1=交换文件名1;modify 文件名;repair文件名;save文件名;run;,Proc Step,常用功能说明:age语句用于批量地重命名文件,按照当前文件和相关文件的排列顺序,依次将后一个文件名重命名给前一个文件,结果是最后一个文件被删除,当前文件名被废弃。Proc datasets library=daily;age today day1-day7;Run;以上程序将数据库daily中的数据集today改名为day1,day1改名为day2,day2改名为day3,原来的最后一个文件名day7被丢弃。,Proc Step,常用功能说明:append语句执行向数据集添加记
32、录的功能,选项”base=数据集名”用以指定要添加记录的数据集,”data=数据集名”则指定所要添加的记录所在的数据集,此选项若省略则默认为当前数据集(最近一次操作的数据集)。Proc datasets;append base=d1 data=d2 force;Run;以上程序将d2中的数据纵向合并到d1,如果d2中有d1中不存在的变量,则相应数据会被舍弃。,Proc Step,常用功能说明:audit语句用于对文件的核查,生成核查文件并对其进行管理;change语句以新文件名替换旧文件名;contents语句用于显示指定数据集或当前数据集的各种属性;copy语句用于将当前库中相应的文件拷贝到
33、指定的库中,选项“out=库标记”用来指定文件要拷贝到的目标库;,Proc Step,常用功能说明:delete语句用于删除指定的文件;exchange语句的功能是将等号前后两个文件的文件名进行互换;modify语句用于修改文件各方面的属性;repair语句用于对指定的文件(受到过某种损坏)进行修复,使其恢复到可以使用的状态;save语句的功能是将其指定的文件保留,当前库中的其他所有文件则被删除。,Proc Step,Proc Step,对数据文件中记录进行排序的sort过程:一般格式:proc sort 选项列表;by 变量名1;run;by语句即用以指定排序所要依据的变量,可为数值型也可为
34、字符型。多个变量时,先按靠前的变量排序,再按照靠后的变量排序。by语句中每个变量前可用descending/ascending选项来指定按照其排序的方式(降序或升序),默认状态为升序。proc sort语句后各选项含义及其用法见下表。,Proc Step,Proc Step,将数据文件输出显示的print过程功能:将SAS数据集的记录以一定的方式显示到输出设备(显示屏);可以显示其全部的变量或部分变量;可以创建从简单列表到可进行数据汇总的各种报告的各种不同的表单。,Proc Step,Print的一般格式proc print options;by var-1;pageby variable;s
35、umby variable;id variable;sum variable;var variable;run;,Proc Step,by语句在所有过程中的用法都相同,即将数据集分割为若干小数据集分别进行处理。pageby语句用来控制换页时变量的显示方式,对于其后所指定的变量,相同的值不会显示在不同的页中,该变量某一值的记录在一页的剩余部分显示不下时,则从该值的第一条记录开始换行显示。sumby语句的作用和pageby语句相似,只不过是将换页的动作换为求和,对指定变量的每一值计算var变量的总计值。id语句的作用是用指定的变量值代替记录编号对每一条记录进行标识。sum语句用于指定报告中要进行求
36、和操作的变量。var语句用于指定要在报告中显示的变量。,Proc Step,过程步常用语句,VAR 语句VAR 语句在很多过程中用来指定分析变量。在VAR 后面给出变量列表:VAR 变量名1 变量名2 变量名n;变量名列表可以使用省略的形式,如X1-X3。例如:var math chinese;,过程步常用语句,MODEL 语句MODEL语句在一些统计建模过程中用来指定模型的形式。其一般形式为 MODEL 因变量 自变量表/选项;比如 Model math=Chinese;即用语文成绩预测数学成绩。,过程步常用语句,BY语句一般用来指定一个或几个分组变量,根据这些分组变量值把观测分组,然后对每
37、一组观测分别进行本过程指定的分析。在使用带有BY语句的过程步之前一般先用SORT过程对数据集排序。比如,假设我们已经把C9501数据集按性别排序,则下列PRINT 过程可以把男、女生分别列出:proc print data=c9501;by sex;run;,过程步常用语句,Class语句在一些过程(如方差分析)中,使用CLASS语句指定一个或几个分类变量,它实际相当于因变量。而在另一些过程(如MEANS)中,CLASS语句作用与BY语句类似,可以指定分类变量,把观测按分类变量分类后分别进行分析。使用CLASS时不需要先按分类变量排序。,过程步常用语句,Output语句在过程步中经常用OUTP
38、UT语句指定输出结果存放的数据集。不同过程中把输出结果存入数据集的方法各有不同,OUTPUT语句是用得最多的一种,其一般格式为:OUTPUT OUT输出数据集名 关键字变量名 关键字变量名;其中用OUT给出了要生成的结果数据集的名字,用“关键字变量名”的方式指定了输出哪些结果(关键字的例子比如MEANS过程中的MEAN,VAR,STD等等),等号后面的变量名指定了这些结果在输出数据集中叫什么名字。,过程步常用语句,Output语句示例proc means data=sasuser.c9501;var math;output out=result n=n mean=meanmath var=va
39、rmath;run;proc print data=result;run;,过程步常用语句,Freq语句FREQ语句指定一个重复数变量,每个观测中此变量的值说明这个观测实际代表多少个完全相同的重复观测。FREQ变量只取整数值。如 freq numcell;,过程步常用语句,Weight语句WEIGHT语句指定一个权重变量,在某些允许加权的过程中代表权重,其值与观测对应的方差的倒数成比例。,过程步常用语句,Id语句有些过程(如PRINT、UNIVARIATE)需要输出观测的代号,这一般使用观测的序号。但是,如果数据集中有一个变量可以用来区分观测(如人名、省市名),就可以用ID语句指定这个变量作为
40、观测标识如:id name;指定用变量NAME的值来标识观测。,过程步常用语句,Where语句用WHERE语句可以选择输入数据集的一个行子集来进行分析,在WHERE关键字后指定一个条件。比如:where math=60 and Chinese=60;指定只分析数学、语文成绩都及格的学生。,过程步常用语句,Where语句LABEL语句为变量指定一个标签,很多过程可以使用这样的标签。其格式为 LABEL 变量名标签 变量名标签;例如 proc print data=sasuser.c9501 label;id name;var math chinese;label name=姓名 math=数学成
41、绩 Chinese=语文成绩;run;,过程步常用语句,Label语句LABEL语句为变量指定一个标签,很多过程可以使用这样的标签。其格式为 LABEL 变量名标签 变量名标签;例如 proc print data=sasuser.c9501 label;id name;var math chinese;label name=姓名 math=数学成绩 Chinese=语文成绩;run;,过程步常用语句,Format语句FORMAT语句可以为变量输出规定一个输出格式。比如 proc print data=sasuser.c9501;format math 5.1 chinese 5.1;run;使得列出的数学、语文成绩宽度占5位,带1位小数。,过程步常用语句,事实上,在生成数据集的DATA步中也可以用FORMAT语句规定变量的输出格式;用LABEL 语句规定变量的标签;用LENGTH语句规定变量的存贮长度用ATTRIB语句同时规定变量的各属性。在数据步中规定的变量属性是附属于数据集本身的,是永久的;在过程步中规定的变量属性(标签、输出格式等)只用于此过程的本次运行。,
链接地址:https://www.31ppt.com/p-2240798.html