




已阅读5页,还剩110页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,清华大学经济管理学院朱世武,zhushwzhushw,ZhuShiwuSchoolofEconomicsandManagement,TsinghuaUniversity,第4章DATA数据集操作(核心),.,本章内容提要,创建数据集语句DATA数据行引导语句CARDS与CARDS4输出语句PUT读入已存在SAS数据集语句SET横向合并数据语句MERGEBY语句删除变量语句DROP与保留变量语句KEEP更改变量名语句RENAME与保留数值语句RETAIN输出外部文件语句FILE定义外部数据文件语句INFILE更新数据语句UPDATE(不讲)修改数据语句MODIFY(不讲)数据导出,.,创建数据集语句DATA,语句格式DATA;DATAview-name/VIEW=view-name);DATAdata-set-name/PGM=program-name);DATAPGM=program-name();DATAVIEW=view-name();DESCRIBE;,选项说明,这里只给出常用选项的说明,其它选项说明可以从SAS系统帮助中查找。,.,例4.1规定要创建的SAS数据集。data;/*系统自动规定数据集名datan*/Dataa;/*创建临时数据集a*/dataResDat.a;/*创建永久数据集resdat.a*/datadata1data2;/*创建两个临时数据集data1和data2*/data_null_;/*特殊名,不创建SAS数据集,用于输出*/Run;,.,例4.2数据集选项举例。datanew(drop=var1);/*去掉数据集new中变量var1*/datanew(keep=_numeric_);/*保留数据集new中所有数值变量*/datanew(label=股本变动历史);/*规定数据集new标签名为”股本变动历史”*/datanew(rename=(var1=uvar2=v);/*将数据集new中变量var1和var2更名为u和v*/databook(index=(authorsubject);/*数据集book对变量authorsubject建立索引*/,.,例4.3创建DATA步数据视窗文件。dataclass/view=class;setResdat.class;run;例4.4存储被编辑程序。dataclass1(keep=nameageweight)/pgm=cl;/*cl是被存贮的SAS程序*/setResDat.class;run;,NOTE:已在文件CL中保存了DATASTEP程序。NOTE:存储的DATASTEP程序无法在不同的操作系统下运行。,.,例4.5用DATA步执行一个被存贮的编辑程序。datapgm=cl;Run;,NOTE:DATASTEP程序加载自文件CL。NOTE:从数据集RESDAT.CLASS.读取了19个观测NOTE:数据集CLASS1有19个观测和3个变量。,.,特殊数据集名,_data_(省略数据集名),data_data_;/*等价于语句data;*/系统自动为数据集赋名:data1,data2,datan.,.,_null_一般和PUT语句一起用。由PUT输出结果,只输出到LOG窗口,不会产生SAS数据集。,80data_null_;81x=exp(5);82y=log(10);83putx=y=;84run;x=148.4131591y=2.302585093NOTE:“DATA语句”所用时间(总处理时间):实际时间0.03秒CPU时间0.00秒,例4.6不产生数据集。data_null_;x=exp(5);y=log(10);putx=y=;run;,.,_last_last_是SAS系统的一个自动变量,取值为最新创建的SAS数据集名。,例4.7查看最新创建的SAS数据集。dataa;set_last_;run;,.,一个DATA语句下多个数据集名,例4.8观测子集的形成。dataFemaleStMaleSt;setResDat.class;ifsex=FthenoutputFemaleSt;elseoutputMaleSt;run;,例中,根据条件产生2个观测子集,名字分别为女同学信息数据集FemaleSt和男同学信息数据集MaleSt。,.,例4.9变量子集的形成。dataheight(keep=nameheight)weight(keep=nameweight);setResDat.class;run;,一个DATA语句下多个数据集名,例中,根据条件产生2个变量子集,名子分别为height,weight,每个数据集由KEEP语句保留两个变量。,.,数据行引导语句CARDS与CARDS4,CARDS语句或DATALINES语句告诉SAS系统下面跟着的是数据行。数据行之前用CARDS语句或DATALINES语句。语句格式:CARDS;或DATALINES;数据行,例4.10数据行之前用CARDS语句。data;inputvar1var2var3$;cards;1620First;,.,数据行中含有分号时,必须用CARDS4或DATALINES4语句。语句格式:Cards4;或DATALINES4;数据行;,例4.11数据行中含有分号时用CARDS4语句。data;inputvar1$var2$var3$;cards4;A;B(;);,Obsvar1var2var31A;B2(;),结果如下:,.,输出语句PUT,PUT语句输出信息到:SAS系统的LOG窗口;SAS系统的OUTPUT窗口;FILE语句规定的外部文件。,.,简单方式:PUT;PUT;列方式:PUTstart-column;格式化方式:PUTstart-column;PUTvariableformat.;PUT(variable-list)(format-list);列表方式:PUTvariable;PUTcharacter-string;PUTvariableformat.;命名方式:PUTvariable=;PUTvariable=start-column;,语句格式,.,选项说明,表4.1变量及其格式说明,.,例4.12用PUT语句产生的输出结果及其比较。data_null_;put132*_;/*在log窗口输出132个下划线_*/put100*1;/*在log窗口输出100个1*/run;data_null_;inputxyz;put_infile_;/*输出最新的数据行到SASLog窗口*/cards;1-590371028;run;,LOG窗口输出结果:,.,data_null_;inputxyz;put_all_;cards;1-590371028;,LOG窗口输出结果:,.,例4.13其它控制输出格式举例。Procsortdata=sashelp.classout=class;Bysex;Run;data_null_;Setclass;bysex;fileprint;putname1-812sex;iflast.sexthenput/Thisisthelastofsex$_page_;run;,.,第一页,第二页,输出窗口显示:,AliceFBarbaraFCarolFJaneFJanetFJoyceFJudyFLouiseFMaryFThisisthelastofF,AlfredMHenryMJamesMJeffreyMJohnMPhilipMRobertMRonaldMThomasMWilliamMThisisthelastofM,.,data;putExampleofoverprintoverprint-;run;,LOG窗口输出结果:,Exampleofoverprint-,.,列方式输出,LOG窗口输出结果:100.00300.000,例4.14控制输出的列位置。dataa;a=100;b=300;puta10-16.2b20-26.3;run;,语句格式:PUTstart-column;,.,列表方式输出,语句格式:PUTvariable;PUTcharacter-string;PUTvariableformat.;修饰符说明:n*规定后面格式重复n次;:规定后面格式输出变量值时去掉前后的空格。,.,LOG窗口输出结果:134,569.2418,969.063,592.19,例4.15应用举例。dataa;x1=134569.236;x2=18969.06;x3=3592.191;put(_all_)(3*comma10.2);run;,dataa;x1=134569.236;x2=18969.06;x3=3592.191;put_all_;run;,.,格式化输出,语句格式:PUTstart-column;PUTvariableformat.;PUT(variable-list)(format-list);,.,例4.16应用举例。dataa;inputname,.,LOG窗口输出结果:53dataa;54inputname,.,上面程序也可以写成:dataa;inputname但第一种方法的效果好。,LOG窗口输出结果:61dataa;62inputname,.,读入已存在SAS数据集语句SET,SET语句从一个或多个已存在的SAS数据集中读取观测值,并将这些观测组合在一个或多个新的数据集中。语句格式:SET/UNIQUE;一个DATA步中可以有多个SET语句,一个SET语句中可以有任个SAS数据集。,.,选项说明,.,例4.17选项说明若干举例。规定临时变量选项Point=:dataa;setResDat.class;obs=_n_;data;don=3,5,7,4;setapoint=n;/*读入数据集a中的第3,5,7,4观测*/output;end;stop;/*使用选项point=时,经常要用stop语句来终止data步的执行*/procprint;run;使用选项point=时,经常要用stop语句来终止data步的执行。因为使用set语句时,指针只有在遇到数据集的最后一条观测才会停止执行,而这里选择读入的最后一条观测一般情况下并不是数据集的最后一条观测,所以,需要专门用stop语句停止指针执行,否则会陷入死循环。,.,去掉stop语句:doend循环不能让指针达到最后一条观测值,set语句会让循环持续执行,形成死循环。data;don=3,5,7,4;setapoint=n;/*读入数据集a中的第3,5,7,4观测*/output;end;run;使用中断工具终止程序运行。,data;seta;don=3,5;output;end;run;/*n在新创建的数据集中*/,例4.18连续两个set语句。dataone;inputxy$;cards;1Groucho3Harpo5Kart;datatwo;inputXZ$;cards;2Chico4Zeppo;Datathree;Setone;Settwo;Run;,数据集one:XY1Groucho3Harpo5Kart,数据集two:XZ2Chico4Zeppo,数据集three:XYZ2GrouchoChico4HarpoZeppo,.,例4.19数据集选项in=var。dataa;setone(in=one)two(in=two);in1=one;in2=two;run;,数据集a:,.,规定临时变量选项NOBS=:dataa;doobsnum=1tolastby3;/*临时变量为last*/setResDat.classpoint=obsnumnobs=last;output;end;stop;run;,.,如何找数据集的观测个数:dataa;a=nobs;setResDat.classnobs=nobs;if_n_=a;run;如何找数据集的最后一个观测值:dataa;setResDat.classnobs=nobs;if_N_=NOBS;run;,.,找数据集最后一个观测值更简单的方法:dataa;setResDat.classend=obs_last;ifobs_last=1;run;输出数据集的最后一个观测值:dataa;setResDat.classEnd=lastobs;iflastobs;x=lastobs;/*将临时变量lastobs的值赋给X*/putlastobservation:_all_;run;,.,例4.20数据集选项说明若干举例。保留部分变量:dataa;setResDat.Class(keep=namesexage);run;datab(keep=namesexage);setResDat.Class;run;datac;setResDat.Class;keepnamesexage;run;上述三段程序的结果相同。注意,但第三段程序用的是KEEP语句,并不是数据集选项的应用。保留部分变量时可生成多个变量子集,如下:dataweight(keep=nameweight)height(keep=nameheight);setResDat.class;run;/*此程序将保留变量同时生成两个变量子集*/,.,保留部分观测:datamales;setResDat.class;wheresex=M;run;datamales;setResDat.class;ifsex=Mthenoutput;run;datamales;setResDat.class;ifsex=Mthendelete;run;,dataFemaleStMaleSt;setResDat.class;ifsex=FthenoutputFemaleSt;elseifsex=MthenoutputMaleSt;run;/*此程序将保留部分观测同时生成两个观测子集*/,保留部分观测时可生成多个观测子集,如下:,.,例4.21数据的纵向合并,相同变量的数据集合并。dataqttn;setResDat.stk000001ResDat.stk000002;run;例4.22数据的纵向合并,不同变量的数据集合并。dataa;setResDat.classResDat.stk000001;run;,例4.23按顺序交替连接数据。dataxyz;inputid$xyz;cards;A12345B11234C10476D23716;datauvw;inputid$uvw;cards;A20550B12332C16899D271115;,procsortdata=xyz;byid;procsortdata=uvw;byid;run;dataa;setxyzuvw;byid;procprintnoobs;run;,.,结果显示:,.,横向合并数据集语句MERGE,MERGE语句将多个数据集中的观测合并为新数据集中的一个观测。SAS系统合并观测的方式依赖于BY语句的使用。语句格式MERGEdata-set-name-1data-set-name-2;,.,选项说明,.,应用举例,例4.24一对一合并dataa;mergeResDat.classResDat.stk000001;run;例中,一对一合并时,不需要BY语句。例4.25匹配合并dataa;mergeResDat.stk000001(keep=dateclprrename=(clpr=clpr000001)ResDat.stk000002(keep=dateclprrename=(clpr=clpr000002);bydate;run;例中,匹配合并必须有BY语句。,.,例4.26使用数据集选(in=),选择股票代码为000001,200011,600601和900903的首次发行与上市数据。datastkcd;inputstkcd$6.;cards;000001200011600601900903;dataiissulst1;mergeresdat.iissulststkcd(in=id);ifid;/*选择满足条件股票的首次发行与上市数据*/bystkcd;run;,BY语句,数据步中,BY语句规定分组变量。用于控制SET,MERGE,UPDATE或MODIFY语句的操作。语句格式ByVariable-1Variable-N;,.,选项说明BY语句概念,.,FIRST.变量和LAST.变量,SAS系统对每个BY组创建两个自动变量:First.variable和Last.variable,用来标识每个BY组的第一个和最后一个观测。对于一个BY组的第一个观测值,First.variable取1,其余取0.对于一个BY组的最后一个观测值,Last.variable取1,其余取0.这些变量不含在新产生的数据集中。,.,例4.28保留各BY组的最后一个观测值。dataa;setResDat.stk000001;month=month(date);year=year(date);procsortdata=a;byyearmonth;datab;seta;byyearmonth;iflast.month;/*保留每月最后一个观测值*/run;,.,删除变量语句DROP与保留变量语句KEEP,DROP语句规定输出数据集中要删除的变量,它对DATA步正在创建的所有SAS数据集都适用。语句格式:DROPvariable-list;其中:varible-list规定输出数据集中要删除的变量。,.,例4.29Drop语句与数据集中的drop=选项。dataa;setResDat.class;dropsexage;/*drop语句*/procprint;run;dataa(drop=sexage);/*数据集中的drop=选项*/setResDat.class;procprint;run;例中,两段程序的效果相同。DROP语句告诉SAS系统新建数据集A中将删除SEX和AGE两个变量。,.,KEEP语句,KEEP语句规定输出数据中要保留的变量,它对DATA步正在创建的所有SAS数据集都适用。语句格式:KEEPvariable-list;其中:variable-list规定输出数据集中要保留的变量。,.,例4.30Keep语句与数据集中的keep=选项。dataa;setResDat.idx000001;keepdateclpr;/*keep语句*/procprintdata=a(obs=10);run;dataa(keep=dateclpr);/*数据集中的keep=选项*/setResDat.idx000001;procprintdata=a(obs=10);run;,.,DROP和KEEP语句使用规则,同一个DATA步不用同时使用DROP和KEEP语句;RENAME语句和KEEP或DROP语句一起使用时,KEEP语句和DROP语句会首先起作用。即,在KEEP语句或DROP语句中使用是旧名字。,.,例4.31RENAME语句和KEEP语句一起使用时,KEEP语句使用旧变量名时程序运行正常,keep语句使用新变量名时程序运行出错。dataa;setResDat.Idx000001;keepdateclpr;/*使用旧变量名,程序运行正常*/renameclpr=clpr_SH;run;dataa;setResDat.Idx000001;keepdateclpr_SH;/*使用新变量名,程序不能正常运行*/renameclpr=clpr_SH;run;,.,Keep语句在rename语句的后面也是先起作用,dataa;setResDat.Idx000001;renameclpr=clpr_SH;keepdateclpr_SH;/*使用新变量名,程序不能正常运。Keep语句在rename语句的后面也是先起作用*/run;,.,数据集选项DROP=和KEEP=使用规则,数据集选项drop=和keep=的使用规则基本同drop和keep语句的使用规则。但更灵活,实现同样的功能,对于不同的数据集,新旧名的使用规则也不同。KEEP语句或DROP语句只能在DATA步中使用。为了在PROC步中保留变量或删掉变量,必须使用数据集选项KEEP或DROP。,.,例4.32读入数据集中的keep=选项使用旧变量名。使用旧变量名,程序运行正常dataa;mergeResDat.Idx000001(keep=dateclprrename=(clpr=clpr_SH)ResDat.Idx399001(keep=dateclprrename=(clpr=clpr_SZ);bydate;run;使用新变量名,程序运行出错dataa;mergeResDat.Idx000001(keep=dateclpr_SHrename=(clpr=clpr_SH)ResDat.Idx399001(keep=dateclpr_SZrename=(clpr=clpr_SZ);bydate;run;,.,例4.33新创建数据集中的keep=选项使用新变量名。如上例中的错误程序,改为新创建数据集中的选项keep=,要用新变量名。dataa(keep=dateclpr_SHclpr_SZ);mergeResDat.Idx000001(rename=(clpr=clpr_SH)ResDat.Idx399001(rename=(clpr=clpr_SZ);bydate;/*程序运行正常*/run;,.,更改变量名语句RENAME,RENAME语句可以更改多个变量的名字。语句格式:RENAMEold-name-1=new-name-1;其中:old-name规定输入数据集中出现的变量名字;new-name规定变量的新名字。由于变量的新名字在输出的数据集中才起作用,所以,在当前DATA步的程序语句须使用老名字。,.,例4.34RENAME更改多个变量名dataa(keep=dateopenlowhighclose);setResDat.Idx000001;renameoppr=openlopr=lowhipr=highclpr=close;procprintdata=a(obs=3);run;,应用举例,OUPPUT窗口显示,.,保留数值语句RETAIN,RETAIN语句来规定单个变量,变量列表,或数组元素的初始值。没有为retain语句的变量赋新值时会保留该变量前面的值。语句格式:RETAIN;选项说明:,.,例4.35没有选项时,规定用INPUT语句或赋值语句创建的所有变量值从DATA步的这次执行到下一次重复时被保留。于是数据值在一些观测中可能保留了本应为缺失值的其它值。dataa;inputid;retain;ifid=1thentest=pass;ifid=2thentest=fail;cards;1222351531;procprintnoobs;run;,.,打印输出结果为:例中,当ID的值为1或2时,都是对的。但当ID等于1和2以外的值时,没有一个IF条件是真的,故TEST没有接收新的值。由于有RETAIN语句,所以,TEST就保持从上一观测中得到的值,这样就产生错误。若从这段程序删除RETAIN语句,当ID值不等于1或2时TEST的值为空格(缺失值).,.,dataa;打印输出结果为:inputid;ifid=1thentest=pass;ifid=2thentest=fail;cards;1222351531;procprintnoobs;run;用_ALL_,_CHAR_或_NUMERIC_规定变量列表时,只有在RETAIN语句之前定义的变量才有效。,.,例4.36对于没有用圆括号括起来初始值,SAS系统对前面列出的所有元素赋初始值。retainmonth1-month51year0abcXYZ;例句中,RETAIN语句设置MONTH1至MONTH5的初值为1,变量YEAR的初值为0,字符变量A,B,C的初值为XYZ。例4.37对于用圆括号括起来初始值时,SAS系统对括号前的第一个变量赋初值。retainmonth1-month5(1);例句中,RETAIN语句分配初始值1给变量month1,而变量month2至month5初始值被置为缺失值。,.,例4.38初始值列表的用法。retainvarl-var4(1234);retainvarl-var4(1,2,3,4);如果出现变量个数比初值个数多,剩余的变量用缺失值作为初始值,同时SAS系统发布一个警告信息。,Retain语句是一个功能强大的语句,利用retain语句可以很方便地实现观测值累乘、缺失观测填充等复杂的数据处理。如下例所示:,.,例4.39变量观测值累乘。Dataa;Setresdat.class;Retainmheight1;Mheight=mheight*height;Run;,ObsNameSexAgeHeightWeightmheight1AlfredM1469.0112.569.002AliceF1356.584.03898.503BarbaraF1365.398.0254572.054CarolF1462.8102.515987124.745HenryM1463.5102.51015182420.996JamesM1257.383.058169952722.737JaneF1259.884.534785631728198JanetF1562.5112.52.174101983E149JeffreyM1362.584.01.358813739E1610JohnM1259.099.58.017001062E1711JoyceF1151.350.54.112721545E1912JudyF1464.390.02.644479953E2113LouiseF1256.377.01.488842214E2314MaryF1566.5112.09.900800722E2415PhilipM1672.0150.07.12857652E2616RobertM1264.8128.04.619317585E2817RonaldM1567.0133.03.094942782E3018ThomasM1157.585.01.7795921E3219WilliamM1566.5112.01.183428746E34,.,例4.40缺失值填充。变量X有缺失值,由前面的值填充变量X的缺失值。,dataa;inputx;cards;100.235.5;run;,dataa1;seta;retainx1;ifx=.thenx1=x;/*在x=.的情况下为x1赋值x,其它情况并没有为x1赋值,由于retain语句的作用,x1保留前面的值,这样x1不会有缺失值,起到填充的作用*/x=x1;dropx1;run;,Obsx1100210031004253563573585,数据集A1,Retain语句的一个很好应用案例是填充变量的缺失值,.,输出外部文件语句FILE,FILE语句用于规定将要输出的外部文件。FILE语句一般要与PUT语句配合使用。同一个DATA步可以用多个FILE语句。FILE语句是可执行语句,因而可以用在条件(IFTHEN)过程中。语句格式FILEfile-specification;FILE-SPECIFICATION选项说明:,.,OPTIONS选项说明(部分):,.,例4.41filename=variable选项应用dataa;fileprintfilename=xxx;/*输出到OUTPUT窗口,put语句打开的文件名为print*/puthello;/*OUTPUT窗口将输出hello*/name=xxx;/*数据集a中有一个变量name和一个观测值print*/run;数据集a,.,dataa;filed:a.txtfilename=xxx;/*输出到文件d:a.txt,put语句打开的文件名为d:a.txt*/puthello;/*文件d:a.txt的内容为:hello*/fname=xxx;run;,数据集a,.,例4.42输出规定格式的外部文本文件。data;setResDat.lstkinfo;a=%a(;b=,;c=);fileD:stock.txt;puta$stkcd$b$lstknm$c$;run;例中程序产生股票宏文本文档。data;setResDat.lstkinfo;a=%a(;b=,;c=);fileD:stock.txt;putastkcdblstknmc;run;,.,定义外部数据文件语句INFILE,INFILE语句用来定义一个外部数据文件,文件中的数据用INPUT语句读取。外部文件可以是已存在的磁盘文件,也可以是从键盘上输入的数据行。语句格式INFILEfile-specification;FILE-SPECIFICATION选项说明:EXTERNALFILE和FILEREF选项类似FILFE语句的相应选项。CARDS|CARDS4|DATALINES|DATALINES4选项指明输入数据为CARDS(CARDS4,DATALINES,DATALINES4)后面的数据流,而非来自外部数据文件。,.,大部分选项的作用和FILE的一致。下面只介绍几个INFILE独有的选项。OPTIONS选项说明,.,例4.43DELIMITER=选项应用dataa;infilecardsdelimiter=,;inputxyz;cards;3,6,91,3,58,8,8;例中,要输入的数据用逗号分隔,创建SAS数据集时用选项DELIMITER=,。,数据集a,例4.44DSD选项应用datascores;infilecardsdelimiter=,;inputtest1test2test3;cards;91,87,9597,92,1,1;例中,分隔符为逗号,但第二个观测值的两个相邻分隔符之间还有缺失值,没有DSD选项时,这两个相邻的分隔符组成一个分隔符,于是,输入数据时会出错。,.,上例加上DSD选项,将两个相邻分隔符之间的数作为缺失值处理datascores;infilecardsdelimiter=,DSD;inputtest1test2test3;cards;91,87,9597,92,1,1;通常情况下,同时加上MISSOVER和DSD两个选项是良好的编程习惯。,.,应用举例,例4.45登录锐思RESSET数据库网站(),选择股票库的退市信息表及TXT创建SAS数据集下载格式,得到利用INFILE语句导入外部数据文件的标准程序。,DataRes_sas.DELINFO_1(label=退市信息);InfileD:/Res_sas/DELINFO20120920132403996(1).txtdelimiter=09xMissoverDsdlrecl=32767firstobs=2;FormatComcd$7.;Formatstkcd$6.;FormatLstknm$12.;FormatStkcdotrd$6.;FormatdelstDtYYMMDD10.;FormatLstdtYYMMDD10.;FormatStkcdbfdelst$6.;,.,FormatExchflg$1.;FormatStktype$1.;FormatThimktflg$1.;FormatISIN$12.;Formatnobs10.;InformatComcd$7.;Informatstkcd$6.;InformatLstknm$12.;InformatStkcdotrd$6.;InformatdelstDtYYMMDD10.;InformatLstdtYYMMDD10.;InformatStkcdbfdelst$6.;InformatExchflg$1.;InformatStktype$1.;InformatThimktflg$1.;InformatISIN$12.;Informatnobs10.;LabelComcd=公司代码;Labelstkcd=股票代码;LabelLstknm=最新股票名称;,.,LabelStkcdotrd=交易时股票代码;LabeldelstDt=退市日期;LabelLstdt=股票上市日期;LabelStkcdbfdelst=退市前代码;LabelExchflg=交易所标识;LabelStktype=股票类型;LabelThimktflg=三板市场标识;LabelISIN=ISIN编码;Labelnobs=观测序号;InputComcd$stkcd$Lstknm$Stkcdotrd$delstDtLstdtStkcdbfdelst$Exchflg$Stktype$Thimktflg$ISIN$nobs;Run;,例中,09x是TAB键的十六进制表示。标准程序除Infile语句的选项外,还包括由Format,InFormat及Label语句规定变量的输出格式、输入格式及标签等。,.,更新数据语句UPDATE,UPDATE语句通过修改数据集中的观测来更新一个主数据集。语句格式UPDATEmaster-data-settransaction-data-set;同BY语句一起使用的格式:UPDATEmaster-data-settransaction-data-set;BYvariable;,.,选项说明,.,MERGE语句和UPDATE语句的比较,MERGE语句和UPDATE语句都能用于更新SAS数据集。当第二个数据集中有缺失数据时,若用MERGE语句,则主数据集中的相应数据自动更新为缺失。若用UPDATE语句,则可以通过选项Updatemode=控制。UPDATE语句通过修改数据集来修改或更新变量,也可以添加新变量。,.,应用举例,例4.46修改数据集。datamaster;/*创建主数据集master*/inputid$name$agesasgrp$heightsex$;cards;9211GU20Y170F9212YUAN19Y165F9213HU16N163F9214WANG21Y178M9215ZHU22N176M;datatrans;/*创建修改数据集trans*/inputid$agesasgrp$height;cards;9211.N.9212.Y168921318N.9214.Y180921523Y176;,datanew;updatemastertrans;byid;procprint;run;,更新后信息如下:,.,例4.47通过对主数据集中的变量重命名,避免被更新数据集覆盖。datamaster;inputid$name$weight;cards;1114sally1251441sue1451750joey1891994mark1652304joe170;datatrans;inputid$name$weight;cards;1114sally1191994mark1742304joe170;,datanew;updatemaster(rename=(weight=orig)in=a)trans(drop=namein=b);byid;ifaandbthendo;change=weight-orig;end;procprintdata=new;run;,更新后信息如下:,.,修改数据语句MODIFY,MODIFY语句扩充DATA步功能,它可以替代,删除或添加观测到一个已存在的SAS数据集上。MODIFY语句是在没有备份的情况下处理SAS数据集,因此使用该语句可以节省磁盘空间。但该语句不能修改数据集的描述部分,如添加变量。,.,语句格式,MODIFYmaster-data-settransaction-data-set;BYby-variable;MODIFYmaster-data-setKEY=index;MODIFYmaster-data-setPOINT=variable;MODIFYmaster-data-set;,.,选项说明,.,数据集访问方式,匹配访问通过索引直接访问通过观测序号直接访问顺序访问,.,修改观测,在包含MODIFY语句的数据步中,可以采用下面的语句往数据集中写入观测。,.,与UPDATE等语句的比较,在数据步中使用MERGE,SET或UPDATE语句时,SAS创建了新的数据集。因此,新数据集的描述符可以和原来不同(如添加和删除变量,修改标签等)。但若使用MODIFY语句,SAS只是在原来的数据集中进行修改,所以不能改变原数据集的描述符。若在MODIFY语句中使用BY语句,则MODIFY语句的效果和UPDATE语句的非常类似,除了以下几点:在MODIFY语句中,主数据集和修改数据集的BY变量不需要事先排序或索引。在MODIFY语句中,主数据集和修改数据集的BY变量都可以有重复值。MODIFY语句不能改变原数据集的描述符信息。,.,应用举例,本节的例子均基于以下数据集:,datastock(index=(partno);inputPARTNO$DESC$INSTOCK17RECDATEdate7.25PRICE;formatrecdatedate7.;cards;K89Rseal3427jul95245.00M4J7sander9820jun9545.88LK43filter12119may9610.99MN21brace4310aug9627.87BC85clamp8016aug969.55NCF3valve19820mar9624.50KJ66cutter618jun9619.77UYN7rod21109sep9611.55JD03switch38309jan9713.99BV1Etimer2603jan9734.50;run;,.,将所有观测的recdate改为今天。,例4.48修改所有观测。datastock;modifystock;recdate=today();run;,.,这里自动变量_iorc_是一个自动变量,包含MODIFY语句尝试进行的每一次I/O操作的代码。,例4.49用修改数据集修改观测。dataaddinv;inputPARTNO$NWSTOCK;cards;K89R55LK4343MN2173UYN7108JD0355;datastock;modifystockaddinv;bypartno;RECDATE=today();INSTOCK=instock+nwstock;if_iorc_=0thenreplace;run;,.,datanewp;inputTOOL_OBSNEWP;cards;1251.00430.00625.751035.00;datastock;setnewp;modifystockpoint=tool_obsnobs=max_obs;if_error_=1thendo;putERRORoccurredforTOOL_OBS=tool_obs/duringDATAstepiteration_n_/TOOL_OBSvaluemaybeoutofrange.;_error_=0;stop;end;PRICE=newp;Run;,例4.50通过观测序号修改数据集。,.,例4.51通过索引修改数据集。datastock;setaddinv;modifystockkey=partno;INSTOCK=instock+nwstock;if_iorc_=0thenreplace;run;,.,例4.52处理重复索引值。创建一个有重复PARTNO值的新修改数据集:datanewinv;inputPARTNO$NWSTOCK;cards;K89R55M4J721M4J726KJ662UYN7108KJ664JD0355BV1E27;,则下面程序会出错datastock;setnewinv;modifystockkey=partno;INSTOCK=instock+nwstock;run;可以使用选项UNIQUE来避免出错datastock;setnewinv;modifystockkey=partno/unique;INSTOCK=instock+nwstock;if_iorc_=0thenreplace;run;,.,例4.53修改,添加,删除变量。datastockstock95stock97;modifystock;ifrecdate01jan97dthendo;outputstock97;removestock;end;elseifrecdate01jan96dthendo;outputstock95;remov
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护士考试题库及答案来源
- 桩板墙施工培训课件
- 电工教学培训课件模板下载
- 2025养老护理员理论试题及答案
- 2025年外贸业务跟单员初级实操技能题库
- 2025篮球裁判考试试题及答案
- 2025年质量工程师中级专业技能考试模拟题集及答案详解
- 桥梁介绍课件
- 2026届湖南长沙一中高二化学第一学期期中经典试题含解析
- 2025年老年健康管理专业知识考试试题及答案
- 企业重组改变组织结构以提高效率
- 污水处理设施运维服务投标方案(技术标)
- 围术期高钾血症的识别与救治
- 微信点餐系统小程序的设计与实现
- 行业标准项目建议书
- 订单评审表-模板
- 夏米尔350Pedm火花机快速入门操作
- 人教新版高中物理必修说课实验练习使用多用电表
- 全国公共英语等级考试PETS一级词汇表word版下载(大全)
- 心电图机的使用及心电图的识别
- 华北理工选矿厂设计教案第16-17讲 辅助设备和设施的选择与计算
评论
0/150
提交评论