SAS统计软件数据步变量与变量属性控制课件.ppt
《SAS统计软件数据步变量与变量属性控制课件.ppt》由会员分享,可在线阅读,更多相关《SAS统计软件数据步变量与变量属性控制课件.ppt(94页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第9章数据步变量与变量属性控制章数据步变量与变量属性控制清华大学经管学院清华大学经管学院 朱世武朱世武本章内容本章内容本章介绍利用数据步变量与信息控制语句进行数据加工整理。数据步变量与信息控制语句规定数据集中变量个数及相关信息。变量与信息控制语句不是执行语句,可以出现数据步的任何地方,且功能相同。ARRAY语句语句 ARRAY语句用于定义数组。数组通常由一组变量构成。利用数组可以简化很多复杂的数据处理过程。SAS系统引用数组等价引用构成数组的那一组变量。显式下标数组语句显式下标数组语句 显式下标数组显式下标数组由数组名,元素个数说明,及元素列表等构成。通过数组名引用整个数组,通过数组元素序号
2、(也称为下标)引用该元素。语句格式ARRAYarray-namesubscript;选项说明:下标的三种格式下标的三种格式 下标用于表示数组中元素的个数和排列的范围。括号可用大括号,中括号或圆括号。下标格式有三种:例9.1用格式一定义一维、二维数组。Arraysimple3red,green,yellow;/*定义一维数组*/例中,数组名为simple,数组有三个元素,对应的变量命名分别为red,green,yellow.Arrayx5,3scorel-score15;/*定义二维数组*/例中,数组名为X,15个变量scorel-score15按顺序从左上角开始逐行放入这个二维数组。例9.2用
3、格式二定义二维数组。Arrayx1:5,1:3scorel-score15;当用1作为数组下界时可以省略。注意:用0作为下界时,可以加快处理时间,因为计算下标的时间减少了。数组元素表示方法数组元素表示方法 数组元素必须全是数值变量,或全是字符变量,可以用任意顺序列出。数组元素的两种表示方法:列出变量名;建立临时数组元素列表。例9.3列出变量名。ArrayC3Cl-C3;ArrayC3;/*和上例句等价*/ArrayA*_NUMERIC_;ArrayA*_CHARACTER_;建立临时数组元素列表:建立临时数组元素列表:_TEMPORARY_;使用临时数组元素列表可以少占用内存,加快执行时间。可
4、以像使用DATA步中变量那样使用临时数组元素,但要注意有下面几点不同:它们没有名字,引用时必须用数组名和下标;不能出现在输出的数据集上;不能用特殊下标(*)来引用所有元素;临时数组元素的值被自动保存,而不是像DATA步中的变量,在下一次重复开始时被置为缺失值。例9.4建立临时数组元素。若用如下程序,则会产生新变量t1,t2,t3;dataa;setResDat.class;arrayt(3)(5,10,15);run;若用临时数组,则不会产生新变量dataa;setResDat.class;arrayt(3)_temporary_(5,10,15);run;NameSexAgeHeight W
5、eight t1 t2 t3AliceF1356.58451015BarbaraF1365.39851015CarolF1462.8102.551015JaneF1259.884.551015JanetF1562.5112.551015JoyceF1151.350.551015使用临时数组不用临时数组NameSexAgeHeight WeightAliceF1356.584BarbaraF1365.398CarolF1462.8102.5JaneF1259.884.5JanetF1562.5112.5JoyceF1151.350.5初始值表示方法初始值表示方法 例9.5数组元素和初值通过对应位
6、置来确定。arraytest(3)t1t2t3(908070);arrayab(5)(543);例中,第一个语句数组元素的个数与初值的个数相同,把初值90,80和70依次赋给变量t1,t1和t3。第二个语句分配5给ab1,4给ab2,3给ab3,因数组元素比给出的初始值多,多余的变量ab4和ab5为缺失值,而且SAS系统将发布一个警告信息。应用举例应用举例 例9.6定义数组例句。arrayrain5x1-x5;arrayab(*)xyz;arrayx*_numeric_;arraytest(3)_temporary_(908070);arraydays7d1-d7;arrayx2:5green
7、reddenatofetzer;arraytest(3:4,3:7)test1-test10;引用显式下标数组元素引用显式下标数组元素 凡是可用表达式的地方,都可以使用数组元素。例9.7通过下标引用数组元素。datanew;inputqa1-qa10qb1-qb10;arraytest10qa1-qa5qb1-qb5;puttest4=test6=;cards;11161111118222222222;例中,输出qa1和qb1的值,即数组元素test(4)引用qa4,数组元素test(6)引用qb1.一个数组的定义仅在当前的DATA步有效。如果想在几个DATA步引用同一个数组,必须在每个DAT
8、A步中都定义这个数组。455datanew;456inputqa1-qa10qb1-qb10;457arraytest10qa1-qa5qb1-qb5;458puttest4=test6=;459cards;qa4=6qb1=8NOTE:数据集WORK.NEW有1个观测和20个变量。NOTE:“DATA语句”所用时间(总处理时间):实际时间0.01秒CPU时间0.01秒461;例9.9规定数组的一些特殊元素作为循环DO语句范围。arrayday(7)d1-d7;doi=2to4;doi=1to7by2;doi=1,3;例中,处理数组DAY中选定的一些特殊元素。循环循环DO组中引用组中引用 例9
9、.10一个循环DO组里处理多个数组。arrayday(*)d1-d4;doi=1todim(day);day(i)=day(i)+10;end;例中,循环DO语句里使用DIM函数得到数组中元素的个数。用DIM函数作为DO语句上界时,这个上界会根据数组元素个数的实际情况自动调整,用DIM函数作为DO语句上界的所有语句都不必改动。例9.10引用规定上下界的一维数组。Arrayyrs76:85year76-year85;doi=76to85;ifyrs(i)=9thenyrs(i)=.;end;do i=lbound(yrs)to hbound(yrs);ifyrs(i)=9thenyrs(i)=.
10、;end;例中,两个DO组是等价的。第二个DO组中LBOUND函数取数组YRS的下界,而HBOUND函数取YRS的上界。DO WHILE和和DO UNTIL组引用组引用 使用DOWHILE或DOUNTIL语句处理数组时,首先要创造循环变量,然后利用数组说明实现DOWHILE或DOUNTIL语句的条件,最后使用程序语句来改变循环变量的值。例9.13DOWHILE语句用法。datatest;inputx1-x5y;arrayt(5)x1-x5;i=1;dowhile(t(i)y);putt(i)=y=;i=i+1;end;cards;123453024686;run;482datatest;483
11、inputx1-x5y;484arrayt(5)x1-x5;485i=1;486dowhile(t(i)y);487putt(i)=y=;488i=i+1;489end;490cards;x1=1y=3x2=2y=3x1=0y=6x2=2y=6x3=4y=6NOTE:数据集WORK.TEST有2个观测和7个变量。NOTE:“DATA语句”所用时间(总处理时间):实际时间0.01秒CPU时间0.00秒493;494run;隐含下标数组语句隐含下标数组语句 隐含下标数组由一个数组名字,一个下标一个下标变量变量和列表名组成。语句格式:ARRAYarray-nameArray-elements;选项说
12、明:例9.14定义字符数组。dataa;inputx1$3.x2$3.;arrayitem(j)$12x1-x10;例中,定义字符数组ITEM,前两个元素x1和x2,长度为3,它们在INPUT语句里定义了。其它8个元素在ARRAY语句里用长度说明选项,给出长度为12。例9.15规定组成数组的元素。Input(x1-x3)($8.)x4x5;Arrayitem_character_;例中,INPUT语句用输入格式$8.读字符变量x1至x3,而x4和x5是数值变量。ARRAY语句使用特殊变量_character_只能引入字符变量到数组中。一个变量或一个隐含下标数组可以是多个隐含数组的元素。引用隐含
13、数组元素引用隐含数组元素 例9.16引用隐含下标数组的元素时,要先设置下标变量,然后在SAS语句中使用数组名字。dataa;inputidx1-x10y1-y10;arraybig(i)x1-x10y1-y10;i=11;putbig;cards;915511111111112222222222;例中,输出隐含数组BIG中的第11个元素值。504dataa;505inputidx1-x10y1-y10;506arraybig(i)x1-x10y1-y10;507i=11;508putbig;509cards;2NOTE:数据集WORK.A有1个观测和22个变量。NOTE:“DATA语句”所用时
14、间(总处理时间):实际时间0.01秒CPU时间0.01秒511;例9.17循环DO组中引用。datatest;inputs1-s5;arrayss1-s5;/*array语句里没有规定下标变量*/do_i_=1to5;/*使用自动变量_i_作为下标变量*/s=s*100;end;cards;.95.88.57.90.65.95.88.57.90.65.95.88.57.90.65.95.88.57.90.65;run;例中,s1到s5中的每个变量值都乘以100.例9.18DOOVER组中引用。datatwo;inputidx1-x10y1-y10;arraybig(i)x1-x10y1-y10
15、;dooverbig;/*等价于doI=1to20;其中20是big中元素的个数。*/ifbig=.Thenbig=0;end;cards;例中,将数组BIG中的所有缺失值改为0。例9.21使用一些数组作为另一些数组的元素。dataa;arraytest1t1q1-t1q10;arraytest2t2q1-t2q10;arraytest3t3q1-t3q10;arrayans(k)test1-test3;inputt1q1-t1q10t2q1-t2q10t3q1-t3q10;dok=1to3;doj=1to10;ifans=.thenans=0;end;end;cards;例中,有一组数据,包
16、括三组测验题,每组又有十个问题。每个学生的测验数据包括30个答案。在DATA步使用ARRAY语句可以把这30个答案中的缺失值改变为0.例9.22使用DOOVER语句处理上例。dooverans;doovertest1;ifans=.Thenans=0;end;end;由于test1,test2,test3维数相同,在内层doover语句中规定的数组名可以是这三个数组名的任一个。只有当嵌套的DOOVER语句引用的每个数组定义不同的下标变量时才能使用嵌套DOOVER语句。INFORMAT语句语句 INFORMAT语句把输入格式与变量联系起来。语句格式:INFORMATvariables;选项说明:
17、选项DEFAULT可以出现在INFORMAT语句中的任何位置,仅适用于当前的DATA步。没有规定临时的缺省输入格式时,使用SAS系统规定的缺省输入格式。例9.23规定临时的缺省输入格式。dataa;informatdefault=3.1default=$char4.;inputx1-x5name$;putx1-x5name;cards;11223344100johnny;run;程序提交后LOG窗口输出显示:1.12.23.34.410John例中,在INPUT语句列出的变量X1-X5和NAME没有规定输入格式,那么使用这里规定的缺省输入格式,即用格式3.1输入X1-X5,用格式$char4.
18、输入NAME.例9.23取消已存在的输入格式。dataa;setResDat.idx000001;informatdate;run;例中,删除变量DATE的输入格式。这里INFORMAT和SET语句的次序是重要的。FORMAT语句语句 语句格式:FORMATvariables;选项说明:选项DEFAULT可以出现在FORMAT语句中的任何位置,仅适用于当前的DATA步。没有规定临时的缺省输出格式时,使用SAS系统规定的缺省输入格式。例9.25规定临时的缺省输出格式。data;formatw$3.y10.3default=8.2default=$8.;w=goodmorning.;x=goodm
19、orning.;y=12.1;z=12.1;putw/x/y/z;run;程序提交后LOG窗口输出:googoodmor12.10012.10例9.27规定日期时间变量的输出格式。dataa;inputname$bdatedate7.;formatbdateworddate.;cards;jimmy15jan84cindy03mar85;procprint;run;如果没有FORMAT语句,表示日期变量date的值将用1960年1月1日和日期值之间的天数输出。因此,对于SAS日期时间值变量,必须用FORMAT语句对变量指定相应的日期时间输出格式,这样才能便于理解。Obsnamebdate1ji
20、mmyJanuary15,19842cindyMarch3,1985LENGTH语句语句 LENGTH语句用于规定存贮变量值的字节长度。语句格式LENGTHvariable-specification-1;其中:variable-specification变量说明项;DEFAULT=n规定新创建数值变量值的缺省字节长度从8改为n值。variable-specification选项的格式选项的格式 变量说明项格式:variable-1length相关选项说明:控制变量长度方法控制变量长度方法 用LENGTH语句或ATTRIB语句都可以指定变量的长度。任意一个用LENGTH语句规定的长度可以用AT
21、TRIB语句改变它,反之亦然。变量的长度依赖于:是数值还是字符变量;变量是如何创建的;有没有LENGTH或ATTRIB语句。数值变量长度控制数值变量长度控制 在SAS数据集中数值变量的存贮长度一般为8个字节(byte)。然而很多值可以用小于8个字节的长度准确地表示。当数据集很大时,使用小于8个字节长度来存贮不需要很精确的值时,可以有效地减少外部存贮的要求。注意:用LENGTH语句截短数据时,可能会引起误差。例9.28截短数据引起的误差问题。dataone;inputa1-4b6.;lengthdefault=3;cards;1.461.251.141.341.351.362.03;datatw
22、o;setone;ifa=1.3;run;例中,数据集TWO中没有观测。因为,第二个DATA步的子集IF语句中的常数1.3用8个字节表示,而数据集ONE中变量A按LENGTH语句规定只有3个字节,因此A不会等于1.3.字符变量长度控制字符变量长度控制 如果不用LENGTH或ATTRIB语句规定变量的长度,字符变量的缺省长由它的第一个观测值决定,这样,后面更长的观测值会被截短。因INPUT语句可隐含地说明字符变量的长度。所以,当LENGTH语句定义的字符长度不同于在INPUT语句中隐含表示的长度时,LENGTH语句应放在INPUT语句前面。例9.29LENGTH语句必须放在INPUT语句前面才能
23、起作用。dataa;lengthname$20;inputname$1-10;cards;(数据行);run;例中,INPUT语句隐含指定变量NAME的长度为10。LENGTH语句(放在INPUT语句前面)给出在创建的数据集A中NAME的长度用20替代10。例9.30字符变量的长由它的第一个观测值决定。datab;inputx;ifx=1theny=no;elsey=yes;Cards;15;run;例中,字符变量Y第一次在赋值语句Y=NO中出现时,它的长度被确定为2。于是,当把YES赋给Y时,仅前两个字符被存储,S丢失了。为解决该问题,或者使用LENGTH语句规定Y的长度,或者重新排列语句顺
24、序。xy11no25yeLENGTH语句位置的重要性语句位置的重要性 改变字字符符变变量量的长度时,LENGTH语句必须放在SET语句的前面;改变数值变量数值变量的长度时,LENGTH语句可以放在任何地方。例9.30SET语句之后的LENGTH语句对字符变量不起作用。dataa;lstknm=深发展;datab;lstknm=大秦铁路;datac;setab;lengthlstknm$12;proc print;run;例中,length语句放在set语句之后不起作用,lstknm的长度为6,所以显示的值分别为深发展和大秦铁。Obslstknm1深发展2大秦铁上段程序的正确写法:dataa;l
25、stknm=深发展;datab;lstknm=大秦铁路;datac;lengthlstknm$12;/*length语句放在set语句之前*/setab;proc print;/*显示正确结果*/run;Obslstknm1深发展2大秦铁路LABEL语句语句 LABEL语句用于为变量加标签。变量标签是对变量的进一步说明,看到标签就能理解变量的意思。这个标签在SAS数据集中同变量名一起被存贮,而且可通过许多SAS过程被打印输出。语句格式:LABEL variable-1=label-1;其中:Variable规定加标签的变量名;Label规定最多40个字符的标签。一个标签语句可以出现若干个变量名
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SAS 统计 软件 数据 变量 属性 控制 课件
限制150内