07-第七章.docx
第六章数据汇总与报表制作第一节运用PRlNT过程制作报表一、过程PRINT的基本语句1. 简洁形式为procprintdata=数据集名;run;数据集dst.lonpar是某航空公司95年3月第一周飞往伦敦和巴黎的航班信息,现在用过程PRINT输出它的内容。程序如076.sas所示。procprintdata=dst.Ionpar;run;ObsF1.IGHTDATEDESTMAI1.FREIGHTBOARDEDREVENUE1821110201.ON3452431S71506342213110211.ON4213582412173823821110211.ON2483072151939304213110221.ON4472991831650665821110221.ON3913841861677726219110231.ON3565472111903227821110231.ON21936820318310G8213110241.ON272370187147026921911024PAR27237018715063410821110241.ON38947918818957811219110251.ON32737417715965412821110251.ON27249717415694813213110281.ON3801222292085582. NOOBS选项若去掉左侧的OBS歹J,可以运用该选项。procprintdata=dst.lonparnoobs;run;程序如077.sas所示。procprintdata=dst.lonparnoobs;run;F1.IGHTDATEDESTMAI1.FREIGHTBOARDEDREVENUE821110201.ON345243167150S34219110211.ON421358241217382821110211.ON248307215193930218110221.ON447293183165066821110221.ON391384186187772219110231.ON358547211190322821110231.ON219388203183108219110241.ON2723701714702821911024PAR27237016715034821110241.ON389479188163576219110251.ON32?374177159654821110251.ON272497174166948219110281.ON3801222292085583. ID语句在有些数据集中,每条记录有其自己的关键字段或标识,例如员工的工号,姓名等等,因而在不用观测的序号时,常希望将这些标识记录的变量置于输出的最左列,以便于查阅。运用ID语句就可实现这一要求。ID语句的一般形式为:ID变量1变量2;ID语句的作用就是在过程PRINT的输出中,不加入OBS歹U,并将语句中指定的变量依次置于输出的最左侧的列。程序见078.sas所示。procprintdata=dst.Ionpar;iddateflight;run;DATEF1.IGHTDESTMAI1.FREIGHTBOARDEDREVENUE110208211.ON345243167150634110212191.ON421356241217382110218211.ON248307215193930110222191.ON447299183185066110228211.ON381384186167772110232191.ON356547211190322110238211.ON219368203183108110242191.ON27237016714702611024219PAR272370167150634110248211.ON389479188169576110252191.ON327374177159654110258211.ON2724S7174158948110282191.ON3801222292065584. VAR语句为了限制变量是否输出以及它们的次序,可运用VAR语句,它的形式如下:VAR变量1变量2;VAR语句一方面指明要输出的变量,另一方面也表明它们出现的次序。程序见079.sas所示。procprintdata=dst.lonpar;vardateflightdestboardedrevenue;run;ObsDATEF1.IGHTDESTBOARDEDREVENUE1110208211.ON1871506342110212191.ON2412173823110218211.ON2151939304110222191.ON1831650665110228211.ON18G187772110232191.ON2111903227110238211.ON203183108110242191.ON18714702911024219PAR18715063410110248211.ON18816357811110252191.ON17715965412110258211.ON17415834813110262191.ON2292085585. WHERE语句一般形式WHERE表达式;作用:只输出访表达式成立的观测。程序见080.sas所示。procprintdata=dst.lonar;vardateflightdestboardedrevenue;whereflight-219,;run;ObsDATEF1.IGHTDESTBOARDEDREVENUE2110212191.ON2412173824110222191.ON1831850668110232191.ON2111903228110242191.ON17147026311024219PAR1715063411110252191.ON17715965413110262191.ON229206558为了实现对观测的选择,也可运用PRINT的如下选项FIRSTC)BS=和OBS=;留意,该选项必需放在括号中,但是NOOBS选项绝不能带括号!程序如080a.sas所示。procprintdata=dst.bclass(firstobs=Iobs=5);run;结果见下。DbsNAME123451.AWRENCE1717278.1JEFFERY1416951.3EDWARD1418750.8PHI1.1.IP1618758.1KIRK17167SO.8AGEHEIGHTSEXWEIGHT6. SUM语句一般形式SUM变量1变量2;作用:对输出的数值变量计算其总和。程序见081.sas所示。procprintdata=dst.lonpar;vardateflightdestboardedrevenue;sumboardedrevenue;run;结果如下:ObsDATEF1.IGHTDESTBOARDEDREVENUE1110208211.ON1S71508342110212191.ON2412173823110218211.ON2151938304110222191.ON1831650665110228211.ON1861677726110232191.ON2111903227110238211.ON2031831088110242191.ON187147026911024219PAR18715083410110248211.ON18816957811110252191.ON17715965412110258211.ON17415694813110262191.ON229208558250822586087. BY语句BY语句即分组小计。在较大的数据集的报表中,不仅要对某些变量计算它的总和,还常须要分组计算它的小计。例如对数据集dst.lonpar,可以按航班计算总乘客人数,也可按日期计算总乘客人数。要在过程PRlNT中实现这一点只要在过程步中加入BY语句,它的形式为BY变量1变量2;加入BY语句,SUM语句的求和功能就是按BY变量的值交叉分组后,计算每个组内指定变量的合计,同时也计算总和。和其它过程一样,过程PRINT中运用了BY语句,就要求读入的数据集必需是按BY变量排序的。若原数据集尚未按BY变量排序,可先用过程SoRT对数据集进行排序。程序如082.sas;procsortdata=dst.airlineout=sorted;byflight;procprintdata=sorted;varflightdatedestboarded;sumboarded;byflight;run;另一个程序如083.sas;procsortdata=dst.bclassout=sorted;bysexage;procprintdata=sorted;varsexageheightweight;sumheightweight;bysexage;run;结果如下:IlOutpirt-(11ntitlcd)慢别:男年舲“4Obs$0(AGeHEIGHTIElCHT性别d!«1=15Obs$exAGeHEIGHT!EIGHT“6262535255555发量IW勇567898. PAGEBY语句在运用了BY语句后,可以运用PAGEBY语句。留意:要运用PAGEBY语句,必需先运用BY语句!一般形式为PAGEBY变量名;留意:该语句仅允许指定一个变量!该语句的作用是将指定的这个变量的各个不同值在不同的页面上输出。程序见084.sas;procsortdata=dst.bclassout=sorted;byagesex;procprintdata=sorted;varagesexheightweight;sumheightweight;byagesex;agebyage;run;该程序将按age的不同取值在不同的页输出。结果如下:IlOutpirt-(11ntitlcd)IheSASSyste11:01Friday,JanuaryH,2001I年ih12性别,男W三12t4¾三*ObsACsxHEIGHTVElGHl9. 总结过程PRINT的一般形式为PROCPRINTDATA=数据集名选项;ID变量1变量2;VAR变量1变量2;WHERE表达式;SUM变量1变量2;BY变量1变量2;PAGEBY变量;RUN;过程PRINT中的各个语句的次序并不重要,可以随意变更次序。二、改进列表报告(一)标题和脚注一般形式为TIT1.En,标题字符';FOOTNOTEn,脚注字符,;该语句具有以下特点:1.n的取值范围从1到10;2 .标题出现在每页的顶部;3 .脚注出现在每页的底部;4 .假如没有定义标题,缺省的标题是'TheSasSystem'5 .假如没有定义脚注,脚注就不出现;6 .没有n的TIT1.E和FTNOTE语句分别等于TIT1.El和FOOTNOTEh7 .标题和脚注语句可以写在PROC语句之前,也可写在过程步之中。程序见085.sas;optionspagesize=20Iinesize=I32;title1 'Class1ofStatistics,;title2 ,NorthChinaUniversityofTechnology,;footnote1'PreparedJan19,2007,;footnote2'BytheDean'procprintdata=sasuser.class(firstobs=lobs=5);run;这两个语句均是全局语句。即1 .可以置于数据步与程序步之外;2 .若设定则始终有效,直至新的TIT1.E语句,FooTNOTE语句执行后变更其设定或SAS进程结束;3 .替代了原先同样号码的标题或脚注;4 .取消拥有更大号码的标题或脚注;5 .运用以下两个简洁语句,可以取消全部的标题和脚注:title;footnote;程序见086.sas<)title2,Beijing);footnote;procprintdata=sasuser.class(firstobs=lobs=5);run;Class1ofStatistics12:37Friday,JarAMry19.20(Obsreexa<ehoicht(二)1.ABE1.选项该选项是PRINT过程的选项,一般用法如下:procprintdata=sas-dataset<iabei>作用为用标签名而不是变量名输出结果。程序如087.sas所示。procprintdata=sasuser.classlabel;run;HeightWeightFirstAgeinininObsnameGenderyearsinchespounds1AliceF1356.584.02BeckaF1365.398.03GailF1484.390.04KarenF125.377.05KathyF1259.884.58MaryF1586.5112.07SandyF1151.350.58SharonF1562.5112.59TammyF142.8102.510AlfredM1469.0112.511DukeM1463.5102.512GuidoM157.0133.013JamesM1257.383.014JeffreyM1362.584.015JohnM1253.039.518PhilipM1872.0150.017RobertM12G4.8128.018ThomasM1157.585.019WilliamM1566.5112.0而不加label的输出结果为:ObsnamesexageheightWeight1AliceF1356.584.02BeckaF1385.388.03GailF1484.390.04KarenF1256.377.05KathyF1259884.58MaryF1568.5112.07SandyF1151.350.58SharonF1562.5112.53TammyF1462.8102.510AIfredM1463.0112.511DukeM1463.5102.512GuidoM1567.0133.013JamesM1257.383.014JeffreyM1362.584.015JohnM1259.033.516PhilipMIG72.0150.017RobertM1284.8128.018ThomasM1157.585.019WilliamM158G.5112.0()1.ABE1.语句假如数据集中的变量尚未规定标签,或者要运用不同于数据集中己有的标签,则可以在过程PRINT的过程步中加入1.ABE1.语句,规定各变量的标签,这时再运用选项1.ABE1.就可运用变量的这一新定义的标签了。1.ABE1.语句的一般形式为:1.ABE1.变量1='标签字符'变量2='标签字符';其中标签字符的长度不得超过256个字符。程序如088.sas所示。procprintdata=dst.bclasslabel;labelname=,NameofStudentinNorthChinaUnviersityofTechnology1;I4:3ZFriday.January13,ZUUlIUWEMXJEFFERYEMWPHI1.1.IPKlRKRzeERTJMlYNMYXYC1.AYH卡f1.ES1.IEMs”OfStudentinWorthChintIhviertityofTechnologyrun;ftOutput-(Entitled)Cjfil符515058605s85484764“505041504444384741524738413855486s5238s0然434330332335-WR蚩胃责女女身女女qM>WIW-WlR公有时变量的标签包含较多的字符(如上例),系统会将标签分成几行,但系统分隔标签无法考虑其含义,为了限制标签的分行,可以在允许分行处加入分隔符,然后在PRINT语句中用以下选项指明分隔符:SP1.IT='分隔符';程序见089sas°procprintdata=dst.bclasslabelsplit=17;labelname='NameofStudentin,NorthChinaUnviersityofTechnology,;run;IlOutpirt-(11ntitlcd)IheSASSyste14:施Friday,January19,2001KeofStudentInObeMorthChinaUhviersityofTednolocy202122232425262;28293031323334353637383940IAWENCtJEFFERYEMAM)PHI1.1.IPKlRKFwERTJAC1.YNMMXYCUYHvr1.ES1.IEJOHNV11.1.IAMMRTHA1.EVlSMYA1.FREDWICF±NIYCARO1.jo1.mPATTYai2A6TJUDY1.OUISEA1.iceJAMESMARIANTlMBARBARAQAVIDKATIEMlCHAt1.SUSAXJ碗1.l1.1.IEROBERTIWsRiWW够w男男女明女MwW:量女男女女女士男明*男明男对比可以看出这两个输出结果的差异。当然可以运用中文标签。程序见090.sas所示。procprintdata=sasuser.classlabel;labelname=,学生姓名,;run;Obs学生姓名GenderAgeinyearsHeightininchesWeightinpounds1AliceF1356.584.02BeckaF1365.398.03GailF1464.390.04KarenF1256.377.05KathyF1259.884.56MaryF1568.5112.07SandyF1151.350.58SharonF1562.5112.59TammyF1462.8102.510AIfredM1483.0112.511DukeM1463.5102.512GuidoM1567.0133.013JamesM1257.383.014JeffreyM1362.584.015JohnM1259.039.518PhilipM1672.0150.017RobertM1264.8128.018ThomasM1157.585.019WilliamM1568.5112.0(四)FORMAT语句过程PRINT输出的数据内容中,若数据集中对变量己经规定了输出格式,则输出的该变量的值都运用规定的输出格式。假如数据集中变量尚未规定输出格式,也可以在过程步中用FORMAT语句为变量指定输出格式,在输出时就采纳指定的输出格式。如数据集dst.airline规定date变量的输出格式为mmddyy8.,则运行程序091.sas,输出结果如下:procprintdata=dst.airline(Arstobs=1obs=10);vardate;run;ObsDATE103/01/90203/02/90303/03/90403/04/90503/05/90803/06/30703/07/90803/08/90903/09/901003/10/90运用FORMAT语句,编制程序092.sas如下所示。procprintdata=dst.airline(Arstobs=1obs=10);vardate;formatdatedate9.;run;输出结果如下:bsDATE1OIMaRI990202MARI990303MARI990404MaRI990505MARI990GOGMARI390707MAR1990808MAR1330909MARl99010IOMARI390在输出中除了运用系统供应的各种现成的输出格式外,还可运用用户自定义的各种格式(稍后介绍)。(五)SAS系统的选项在SAS进程中有两种方法可以修改选项,提交OPTloNS语句和在交互操作中进入OPlNlONS窗口操作。其中交互操作的菜单如下:Il工。oISRunSolutionsWindowHelpQQueryI3TableEditorGraphicsEditorReportEditorHImageEditorTextEditor手口昌咬X电蠹K:led)(c)1999-2001bySASInstituteIroprietarySoftwareReIease8.2(1oSAS-TEMPORARYSETINIT,Site(onisexecutingontheWIh1.PROfIizationused:0.4seconds0.53secondsKeyboardMacrosAddAbbreviation.Customize.HIOptionsIEnhancedEditor.System.EiihancedEditorKejrsKeys结果如下:下面介绍OpTIoNS语句。该语句的一般形式为OPTIONS选项1选项2;以下的系统选项与过程PRINT输出结果的形式有关。CENTER(NOCENTER)输出的内容居中(靠左对齐),缺省为居中。DATE(NODATE)在每个输出页的右上侧加入(不加入)进程起先的日期和时间,缺省为加入日期和时间。NUMBER(NONUMBER)在每个输出页加入(不加入)页码。缺省为加入页码。PAGENO=n将输出页码从n起先计数,缺省的是n=l。1.lNESIZE=列数输出的每一行可包含的最大字符数,缺省为96。PAGESlZE=行数输出的每一页可包含的最大行数,缺省为54。程序如093.sas所示。optionsnocenternodatenonumber;procprintdata=dst.airline(Arstobs=1obs=10);vardate;formatdatedate9.;run;结果如下:三、运用菜单实现数据集列表输出首先在分析员应用程序中打开一个数据集,然后点击下列菜单:GraphsStat1.istData.Tables.打开对话框利用下方的三个按钮进行设置即可。四、过程PRINTTO过程PRINT的输出都存放在OUTPUT窗口之中。若须要保存结果,可以在菜单中选择saveas将结果存入指定的文件。SAS也供应另一种方法,即运用过程PRINTT0,它可将过程的输出结果和运行中的1.OG信息按原有的形式分别以文本文件的格式存入指定的文件中。运用过程PRINTT0的语句形式为:PROCPRINTT0PRINT=,文件><1.0G=,文件2,><NEW>RUN;运行上述程序后,并没有干脆的输出结果,但在它之后运行的过程,其输出结果将自动依次分别存入文件1(OUtPUt窗口的结果)和文件2(log窗口的结果)。若提交的指示以下的语句:PROCPRINTTO;RUN;则将解除原来将输出结果和运行信息存入文件的设定,复原将输出结果存入OUTPUT窗口,1.oG信息存入1.oG窗口。程序如094.sas所示。procprinttoprint=,dtempoutput.txt'log=,dtemplog.txt'procprintdata=dst.bclass;run;运行上述程序后,将以后运行的过程的结果依次记入上述两个文件。若希望每一个程序运行的结果单独存放,即清除以前程序运行存入的结果,应当在PRINTTO中加入选项NEWo程序如095.sas所示。procprinttoprint-d:tempoutput.txt'log-d:templog.txt'new;run;procprintdata=dst.bclass;run;五、过程FORMAT实际当中常常须要给变量值写标签,如:IT'Female'2,Male,otherT,Miscodcd,又如IOW49TBelowAverage'5()99T,Average'100-highT'AboveAvcmgc'再如'A''Good'B'W,Fair,FToorj,U,T,S<x,Instructor'other>'Misccdcd'因此须要运用自定义格式。过程FORMAT用于自定义输出格式。一般形式为:PROCFORMAT;VA1.UE格式名范围I='标签1'范围2=标签2;RUN;其中,格式名是长度不超过8个字符的SAS名,但不能以数字结尾,也不能与己有的输出格式名重名。若定义的是字符型的输出格式,则须要加上美元符号$。包含美元符号在内,格式名的长度不超过8个字符。在应用格式名时,$是格式名的一部分,不能与格式名分开书写!在VA1.UE语句中提及格式名时绝不能加句点。自定义的输出格式和系统供应的输出格式在调用形式上是一样的。如程序096.sas所示。procformat;valuegenderl='female'2='male'other='miscoded,;run;datatemp;inputname$1-3sex5;cards;aaa1bbb2ccc1ddd1eee2fffrun;procprint;formatsexgender.;run;Other表示在列举范围之外的全部值(不论是字符型的还是数字型的变量),(本例中即为除1和2之外的全部值),包括缺失值,是系统默认的名字。假如在上述程序中将Other写成了others,则在1.OG窗口会出现绿色字体。如下所示。昌1.og-(Untitled)iOTE:Copyright(c)1339-2001bySASInstituteInc.,Cary,NC,USA.NOTE:SAS(r)ProprietarySoftwareRelease8.2(TS2M0DBCS2944)1.icensedtoSAS-TEMPORARYSETINIT,Site0000000031.NOTE:ThissessionisexecutingontheWIh1.PROplatform.NOTE:SASinitializ&tionused:realtime0.5?secondscputime0.51seconds1 procformat;NOTE:SC1.sourceIine.,2 valuegender1三,female*2='male'OtherS='miscoded';NOTE:FormatGENDERhasbeenoutput.WARNING1-322:ASSUmingthesymbolOTHERwasmisspelledasothers.3 run;NOTE:PROCEDUREFORMATused:realtime0.08secondscputime0.00seconds绿色字体表示,虽然书写错误,但不影响结果的输出。正确的结果如下所示。Obsnamesex1aaafemaIe2bbbmale3CCCfemaIe4dddfemaIe5eeemalefffmiseeded如程序097.sas所示。procformat;valuehhhlow-140='low,140-160-average'160-high-aboveaverage'run;datatemp;inputname$1-3height5-7;cards;aaa125bbb135ccc145ddd150eee157fff176run;procprint;formatheighthhh.;run;在上述规定数值变量的范围时,low表示最小值,但不含有缺失值,high表示最大的数值。结果如下:ObsnameheightabCdefabCdefabCdef123456lowlowaverageaverageaverageaboveaverage如程序098.sas所示。procformat;value$gradeA=,best,B='better'C=,good'other='miscoded,;run;datatemp;inputname$1-3marks$5;cards;aaaAbbbAcccBdddCeeeefffC,run;procprint;formatmarksSgracle.;run;结果如下:Obsnamemarks123456abCdefabCdefabCdeftttdCdSStOsoeeeOiObbbgmg此处千万留意,在应用格式时,$是格式名的一部分,绝不能与格式名之间有空格!也可运用汉语标签,如程序099.sas所示。procformat;valuegenderI=女2='男'other='编码错误';run;datatemp;inputname$1-3sex5;cards;aaa1bbb2ccc1ddd1eee2fffrun;procprint;formatsexgend