char09.docx
- 文档编号:27505350
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:19
- 大小:20.79KB
char09.docx
《char09.docx》由会员分享,可在线阅读,更多相关《char09.docx(19页珍藏版)》请在冰豆网上搜索。
char09
例9.1用格式一定义一维、二维数组。
Arraysimple{3}red,green,yellow;/*定义一维数组*/
例中,数组名为simple,数组有三个元素,对应的变量命名分别为red,green,yellow.
Arrayx{5,3}scorel-score15;/*定义二维数组*/
例中,数组名为X,15个变量scorel---score15按顺序从左上角开始逐行放入这个二维数组。
例9.2用格式二定义二维数组。
Arrayx{1:
5,1:
3}scorel-score15;
当用1作为数组下界时可以省略。
例9.3列出变量名。
ArrayC{3}Cl-C3;
ArrayC{3};/*和上例句等价*/
ArrayA{*}_NUMERIC_;
ArrayA{*}_CHARACTER_;
例9.4数组元素和初值通过对应的位置来确定。
arraytest(3)t1t2t3(908070);
arrayab(5)(543);
例中,第一个语句数组元素的个数与初值的个数相同,把初值90,80和70依次赋给变量t1,t1和t3。
第二个语句分配5给ab1,4给ab2,3给ab3,因数组元素比给出的初始值多,多余的变量ab4和ab5为缺失值,而且SAS系统将发布一个警告信息。
例9.5定义数组例句。
arrayrain{5}x1-x5;
arrayab(*)xyz;
arrayx[*]_numeric_;
arraytest(3)_temporary_(908070);
arraydays{7}d1-d7;
arrayx{2:
5}greenreddenatofetzer;
arraytest(3:
4,3:
7)test1-test10;
例9.6通过下标引用数组元素。
datanew;
inputqa1-qa10qb1-qb10;
arraytest{10}qa1-qa5qb1-qb5;
puttest{4}=test{6}=;
cards;
11161111118222222222
;
例中,输出qa1和qb1的值,即数组元素test(4)引用qa4,数组元素test(6)引用qb1.
例9.7规定数组元素的下标为DO组循环变量的值。
arrayday(7)d1-d7;
doi=1to7;
ifday(i)=99thenday(i)=100;
end;
例中,数组元素的下标从1到7,于是循环变量I就取1到7。
依次检查变量d1到d7的值,并将99改为100。
例9.8规定数组的一些特殊元素作为循环DO语句的范围。
arrayday(7)d1-d7;
doi=2to4;
doi=1to7by2;
doi=1,3;
例中,处理数组DAY中选定的一些特殊元素。
例9.9一个循环DO组里处理多个数组。
arrayday(*)d1-d4;
doi=1todim(day);
day(i)=day(i)+10;
end;
例9.10引用规定上下界的一维数组。
Arrayyrs{76:
85}year76-year85;
doi=76to85;
ifyrs(i)=9thenyrs(i)=.;
end;
doi=lbound(yrs)tohbound(yrs);
ifyrs(i)=9thenyrs(i)=.;
end;
例中,两个DO组是等价的。
第二个DO组中LBOUND函数取数组YRS的下界,而HBOUND函数取YRS的上界。
例9.11引用规定上下界的两维数组。
arrayx{6:
9,0:
9}x60-x99;
doi=6to9;
doj=0to9;
ifx(i,j)=0thenx(i,j)=.;
end;
end;
doi=lbound1(x)tohbound1(x);
doj=lbound2(x)tohbound2(x);
ifx(i,j)=0thenx(i,j)=.;
end;
end;
例9.12DOWHILE语句用法。
datatest;
inputx1-x5y;
arrayt(5)x1-x5;
i=1;
dowhile(t(i) putt(i)=y=; i=i+1; end; cards; 123453 024686 ; run; 例9.13定义字符数组。 dataa; inputx1$3.x2$3.; arrayitem(j)$12x1-x10; 例中,定义字符数组ITEM,前两个元素x1和x2,长度为3,它们在INPUT语句里定义了。 其它8个元素在ARRAY语句里用长度说明选项,给出长度为12。 例9.14规定组成数组的元素。 Input(x1-x3)($8.)x4x5; Arrayitem_character_; 例中,INPUT语句用输入格式$8.读字符变量x1至x3,而x4和x5是数值变量。 ARRAY语句使用特殊变量_character_只能引入字符变量到数组中。 例9.15引用隐含下标数组的元素时,要先设置下标变量,然后在SAS语句中使用数组名字。 dataa; inputidx1-x10y1-y10; arraybig(i)x1-x10y1-y10; i=11; putbig; cards; 915511111111112222222222 ; 例中,输出隐含数组BIG中的第11个元素值。 例9.16循环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.17DOOVER组中引用。 datatwo; inputidx1-x10y1-y10; arraybig(i)x1-x10y1-y10; dooverbig;/*等价于doI=1to20;其中20是big中元素的个数。 */ ifbig=.Thenbig=0; end; cards; 例中,将数组BIG中的所有缺失值改为0。 例9.18一个循环DO组引用多个数组。 datathree; inputf1-f100; arrayff1-f100; arraycc1-c100;/*数组f和c使用_I_作为下标变量*/ dooverf;/*等价于do_i_=1to100;*/ c=(f-32)*5/9;/*表示do循环执行100次*/ end; cards; ; 例中,DOOVER处理两个数组,这种情况要求数据有相同的元素和下标变量。 例9.19将例9.12改为用隐含下标变量。 datafour; inputx1-x5y; arraytx1-x5; _I_=1; dowhile(t putt=y=; _I_=_I_+1; end; cards; 123453 024686 ; 因一个隐含下标数组可以是其它隐含下标数组的元素,故允许有二维或更高维的隐含下标。 例9.20使用一些数组作为另一些数组的元素。 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; 例中,有一组数据,包括三组测验题,每组又有十个问题。 每个学生的测验数据包括30个答案。 在DATA步使用ARRAY语句可以把这30个答案中的缺失值改变为0. 例9.21使用DOOVER语句处理上例。 dooverans; doovertest1; ifans=.Thenans=0; end; end; 由于test1,test2,test3维数相同,在内层doover语句中规定的数组名可以是这三个数组名的任一个。 例9.22规定临时的缺省输入格式。 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.输入NAME. 例9.23取消已存在的输入格式。 dataa; setfdata.a000001; informatdate; run; 例中,删除变量DATE的输入格式。 这里INFORMAT和SET语句的次序是重要的。 例9.24规定临时的缺省输出格式。 data; formatw$3.y10.3default=8.2default=$8.; w='goodmorning.'; x='goodmorning.'; y=12.1; z=12.1; putw/x/y/z; run; 程序提交后LOG窗口输出: goo goodmor 12.100 12.10 例9.25使用自定义的格式输出。 procformat; valuesexfmt1=male2=female; dataal; inputname$sex@@; formatsexsexfmt.; cards; jane2bill1cindy2helen2 ; procprint; run; 例中, 用FORMAT过程定义输出格式SEXFMT。 在DATA步中FORMAT语句把SEXFMT同变量SEX联系起来。 当以后用一些过程输出SEX值时。 MALE和FEMALE替代1和2被输出。 例9.26规定日期时间变量的输出格式。 dataa; inputname$bdatedate7.; formatbdateworddate.; cards; jimmy15jan84 cindy03mar85 ; procprint; run; 如果没有FORMAT语句,表示日期变量date的值将用1960年1月1日和日期值之间的天数输出。 例9.27截短数据引起的误差问题。 dataone; inputa1-4b6.; lengthdefault=3; cards; 1.46 1.25 1.14 1.34 1.35 1.36 2.03 ; datatwo; setone; ifa=1.3; run; 例中,数据集TWO中没有观测。 因为,第二个DATA步的子集IF语句中的常数1.3用8个字节表示,而数据集ONE中变量A按LENGTH语句规定只有3个字节,因此A不会等于1.3. 例9.28LENGTH语句必须放在INPUT语句前面才能起作用。 dataa; lengthname$20; inputname$1-10; cards; (数据行) ; run; 例中,INPUT语句隐含指定变量NAME的长度为10。 LENGTH语句(放在INPUT语句前面)给出在创建的数据集A中NAME的长度用20替代10。 例9.29字符变量的长由它的第一个观测值决定。 datab; inputx; ifx=1theny='no'; elsey='yes'; Cards; 1 5 ; run; 例中,字符变量Y第一次在赋值语句Y=‘NO’中出现时,它的长度被确定为2。 于是,当把‘YES’赋给Y时,仅前两个字符被存储,‘S’丢失了。 为解决该问题,或者使用LENGTH语句规定Y的长度,或者重新排列语句顺序。 例9.30SET语句之后的LENGTH语句对字符变量不起作用。 dataa; scode=’0001’; datab; scode=’600001’; datac; setab; lengthscode$6;/*length语句放在set语句之后不起作用*/ procprint;/*scode的长度为4,所以显示的预测分别为0001和6000*/ run; 上段程序的正确写法: dataa; scode=’0001’; datab; scode=’600001’; datac; lengthscode$6;/*length语句放在set语句之前*/ setab; procprint;/*显示正确结果*/ run; 例9.31复杂程序中的LENGTH语句。 dataout; delete; %macroa(x); dataa; scode="&x"; dataout; setouta; lengthscode$6; %menda; %a(0001); %a(0002); %a(600001); %a(600002); procprint; run; 程序中,没有用LENGTH语句变量SCODE的长度,它的长度由第1个观测值决定为4,于是读入第3个观测值时出错,只能读入前4个字符。 正确程序如下: dataout; delete; %macroa(x); dataa; scode="&x"; dataout; lengthscode$6; setouta; %menda; %a(0001); %a(0002); %a(600001); %a(600002); procprint; run; 例9.32Label语句的两种写法。 第一种写法: Label scode=”交易所用代码|stockcodebyexchange” hstocd="最新股票代码|stockcode” shrsdt=“观测日|sharesoutstandingobservationdate” shrout=“观测到的b股股本|bsharesoutstanding”; 第二种写法: labelscode=”交易所用代码|stockcodebyexchange”; labelhstocd="最新股票代码|stockcode”; labelshrsdt=“观测日|sharesoutstandingobservationdate”; labelshrout=“观测到的b股股本|bsharesoutstanding”; 例9.33删除变量的标签。 Labelscode=’’hstocd=’’shrsdt=’’shrout=’’; 例9.34对单个变量定义一种属性。 attribscodelength=$6; 例9.35对单个变量定义多种属性。 attribdateinformat=mmddyy.Format=worddate.; 例9.36对多个变量定义相同的多种属性。 attribS1S2S3length=$4label=’SCORE’; 例9.37对多个变量定义不同的多种属性。 attribSlength=$4label=’SCORE’dateinformat=mmddyy. Format=worddate.label=’TESTDATE’; 例9.38对变量列表定义一种属性。 attribmonth1-month12label=’MONTHLYSALES’; 变量后面几种属性选项的次序是任意的。 例9.39DROP语句的两种等价用法。 dataa; setfdata.class; dropsexage; procprint; run; dataa(drop=sexage); setfdata.class; procprint; run; 例中,两段程序的效果相同。 DROP语句告诉SAS系统新建数据集A中将删除SEX和AGE两个变量。 例9.40KEEP语句的两种等价用法。 dataa; setfdata.a1a0001; keepdateclpr; procprintdata=a(obs=10); run; dataa(keep=dateclpr); setfdata.a1a0001; procprintdata=a(obs=10); run; 例9.41KEEP语句使用旧变量名时程序运行正常。 dataa; mergefdata.hqck101(keep=datenumberrename=(number=num101)) fdata.hqck199(keep=datenumberrename=(number=num199)); bydate; run; 例9.42KEEP语句使用新变量名时程序出错。 dataa; mergefdata.hqck101(keep=datenum101rename=(number=num101)) fdata.hqck199(keep=datenum199rename=(number=num199)); *Keep后面用的是新名子; bydate; run; dataa; mergefdata.hqck101(keep=daterename=(number=num101)) fdata.hqck199(keep=daterename=(number=num199)); *没有Keep要用的变量number; bydate; run; 例9.43应用举例。 dataa(keep=dateopenlowhighclose); setfdata.A1a0001; renameoppr=openlopr=lowhipr=highclpr=close; procprintdata=a(obs=3); run; 例9.44没有选项时,规定用INPUT语句或赋值语句创建的所有变量值从DATA步的这次执行到下一次重复时被保留。 于是数据值在一些观测中可能保留了本应为缺失值的其它值。 dataa; inputid@@; retain; ifid=1thentest=’pass’; ifid=2thentest=’fail’; cards; 1222351531 ; procprintnoobs; run; 打印输出结果为: ID Test 1 Pass 2 Fail 2 Fail 2 Fail 3 Fail 5 Fail 1 Pass 5 Pass 3 Pass 1 Pass 例中,当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; 打印输出结果为: ID Test 1 Pass 2 Fail 2 Fail 2 Fail 3 5 1 Pass 5 3 1 Pas 例9.45对于没有用园括号括起来初始值,SAS系统对前面列出的所有元素赋初始值。 retainmonth1-month51year0abc‘XYZ’; 例句中,RETAIN语句设置MONTH1至MONTH5的初值为1,变量YEAR的初值为0,字符变量A,B,C的初值为XYZ. 例9.46对于用圆括号括起来初始值时,SAS系统对括号前的第一个变量赋初值。 retainmonth1-month5 (1); 例句中,RETAIN语句分配初始值1给变量month1,而变量month2至month5初始值被置为缺失值。 例9.47初始值列表的用法。 retainvarl-var4(1234); retainvarl-var4(1,2,3,4); 如果出现变量个数比初值个数多,剩余的变量用缺失值作为初始值,同时SAS系统发布一个警告信息。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- char09