数据步循环与转移控制.ppt

上传人:小飞机 文档编号:6296706 上传时间:2023-10-14 格式:PPT 页数:49 大小:419KB
返回 下载 相关 举报
数据步循环与转移控制.ppt_第1页
第1页 / 共49页
数据步循环与转移控制.ppt_第2页
第2页 / 共49页
数据步循环与转移控制.ppt_第3页
第3页 / 共49页
数据步循环与转移控制.ppt_第4页
第4页 / 共49页
数据步循环与转移控制.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《数据步循环与转移控制.ppt》由会员分享,可在线阅读,更多相关《数据步循环与转移控制.ppt(49页珍藏版)》请在三一办公上搜索。

1、第8章 数据步循环与转移控制,清华大学经管学院 朱世武Resdat样本数据:SAS论坛:,DO语句,DO语句必须由一个END语句来结束。DO和END语句之间的这些语句称为一个DO组。DO组可以嵌套任意次。DO语句有5类:简单DO语句;循环DO语句;DO OVER语句;DO WHILE语句;DO UNTIL语句。,简单DO语句,语句格式DO;一些SAS语句END;,应用举例,例8.1 IF/THEN语句用中DO.data a;set ResDat.class;if age14 then do;h_cm=30.5*height/12;put name=sex=age=h_cm=;end;run;,

2、329 data a;330 set fdata.class;331 if age14 then do;332 h_cm=30.5*height/12;333 put name=sex=age=h_cm=;334 end;335 run;Name=Janet Sex=F Age=15 h_cm=158.85416667Name=Mary Sex=F Age=15 h_cm=169.02083333Name=Philip Sex=M Age=16 h_cm=183Name=Ronald Sex=M Age=15 h_cm=170.29166667Name=William Sex=M Age=15

3、 h_cm=169.02083333NOTE:从数据集 FDATA.CLASS 读取了 19 个观测。NOTE:数据集 WORK.A 有 19 个观测和 6 个变量。NOTE:“DATA 语句”所用时间(总处理时间):实际时间 0.01 秒 CPU 时间 0.01 秒,上例与下面的if语句效果一样,但是IF语句效率较低。If age14 then H_cm=30.5*height/12;If age14 then Put name=sex=age=h_cm=;,循环DO语句,DO组中的语句需要被重复执行时要用到循环DO语句。循环DO语句根据下标变量重复执行DO和END语句之间的语句 语句格式D

4、O index_variable=specification-1;一些SAS语句END;其中:index-variable选项定义下标变量,用于控制DO组的执行方式和重复次数。下标变量包含在创建的数据集中,可以用DROP语句删除。,SPECIFICATION选项格式,Start;Specification选项说明:,例8.2 缺省的步长为1。do I=1 to 1000;do I=1 to y+3;do I=1 to exit;,例8.3 起始值例句。do i=5;do i=1 to n;do i=n to 1 by 1;do i=k+1 to n-1;do i=1 to k-1,k+1 to

5、 n;do i=2,3,5,7,11,13,17;do i=0.1 to 0.9 by 0.1,1 to 10 by 1,20 to 100 by 10;do i=saturday,sunday;do i=01jan99d,25feb99d;do i=01jan99d to 01jan2000d by 1;例句子中,起始值必须全部是数值或全部是字符常数,也可以是变量。字符常数必须用引号括起来。,例8.4 使用表达式选项。do i=1 to 10 while(xy);do i=10 to 0 by 1 while(month=jan);,应用举例,例8.5 用GO TO语句跳出循环体。data

6、a;input x y;if xy then goto skip;/*skip是循环体外的语句标号*/y=log(y-x);yy=y-20;skip:if y0 then do;put x=y=;z=log(x-y);end;cards;2 65 35-1;,数据集a,336 data a;337 input x y;338 if xy then goto skip;/*skip是循环体外的语句标号*/339 y=log(y-x);340 yy=y-20;341 skip:if y0 then do;342 put x=y=;343 z=log(x-y);344 end;345 cards;x

7、=5 y=-1NOTE:数据集 WORK.A 有 3 个观测和 4 个变量。NOTE:“DATA 语句”所用时间(总处理时间):实际时间 0.04 秒 CPU 时间 0.01 秒349;350 run;,LOG窗口显示:,例8.6 产生指定观测值个数的数据集。data a;do n=1 to 100;output;end;run;例中,产生一个含有100个观测值的数据集。,例8.7 自然数求和。data a;t=0;do n=1 to 100;t=t+n;output;end;run;例中,求1到100的自然数之和。,例8.9 用循环DO语句处理数组。array day7 d1-d7;/*定义

8、数组day7*/do i=1 to 7;if dayi=99 then dayi=100;end;例中,用循环DO语句处理数组时,便于进行批量更新。,DO OVER语句,DO OVER语句对隐含下标数组元素执行DO组里的语句。语句格式DO OVER array-name;若干SAS语句END;其中:选项array-name规定一个隐含下标数组。,应用举例,例8.10 隐含数组的所有元素乘以100。data test;input sc01-sc05;array s sc01-sc05;do over s;/*等价于do _i_=1 to 5*/s=s*100;end;cards;.95.88.9

9、9.77.56;run;,DO WHILE语句,DO WHILE语句使得当条件成立时重复地执行DO组中的语句。语句格式DO WHILE(expression);选项expression规定任一有效表达式。,应用举例,例8.11 当N值小于5时重复执行DO组中的语句。data a;n=0;do while(n lt 5);put n=;n+1;end;run;,DO UNTIL语句,有条件地执行DO组中的语句。语句格式 DO UNTIL(expression);其中:选项expression规定任一有效表达式。,应用举例,例8.12 重复循环直到n=5时停止。data a;n=0;do unti

10、l(n=5);put n=;n+1;end;run;,END语句,END语句是组成DO组或SELECT组的最后一个语句。语句格式END;,应用举例,DO;若干个SAS语句END;SELECT(expression);When(expression)SAS语句;Otherwise SAS语句;END;,SELECT语句,SELECT语句选择执行SAS语句。语句格式SELECT;WHEN(when-expression-1)statement;)statement;END;选项说明:,应用举例,例8.13 有SELECT表达式的SELECT语句。data a;set ResDat.st_list;

11、obs=_n_;x=uniform(0);select(obs);when(1)x=x*10;when(2,4,6);when(3,5,7,13,15,17)x=x*100;otherwise x=1;end;run;例中,根据OBS来计算新变量X的值。当OBS为1时,执行x=x*10。当OBS为2,4,6时,X值不变。当OBS为3,5,7,13,15,17时,执行X=X*100。OBS为其它值时,执行x=1。,例8.14 没有SELECT表达式的SELECT语句。data _null_;do mon=jan,feb,mar,apr,may,jun,jul,aug,sep;/*mon循环*/s

12、elect;when(mon in(jun,jul,aug)put summer mon=;when(mon in(mar,apr,may)put spring mon=;otherwise put fall or winter mon=;end;end;run;,361 data _null_;362 do mon=jan,feb,mar,apr,may,jun,jul,aug,sep;363 select;364 when(mon in(jun,jul,aug)put summer mon=;365 when(mon in(mar,apr,may)put spring mon=;366 o

13、therwise put fall or winter mon=;367 end;368 end;369 run;fall or wintermon=janfall or wintermon=febspring mon=marspring mon=aprspring mon=maysummer mon=junsummer mon=julsummer mon=augfall or wintermon=sepNOTE:“DATA 语句”所用时间(总处理时间):实际时间 0.03 秒 CPU 时间 0.01 秒,例8.15 SELECT组的正确及错误用法举例。select(x);when(x=2)p

14、ut two;/*错误用法*/end;select(x);when(2)put two;/*正确用法*/end;select;when(x=2)put two;/*正确用法*/end;run;例中,后两个程序的效果相同。,IF语句,IF语句的两种类型:条件IF语句,含有一个THEN子句或ELSE子句;子集IF语句,没有子句。IF-THEN与IF-THEN/ELSE语句表达式为真时执行THEN后面的语句,表达式为假执行ELSE后面的语句。语句格式:IF expression THEN expression;,例8.16 应用举例。data;if x then delete;if status=O

15、K and type=3 then count+1;if age ne agecheck then delete;if x=0 thenif y ne 0 then put x zero,y nozero;else put x zero,y zero;else put x nozero;if ans=9 thendo;ans=.;put invalid answer for id=;end;else do;/*当IF条件不成立时,执行下面另一DO组*/ans=ans1;valid+1;end;,子集IF语句,语句格式:IF expression;其中:expression是任意有效的表达式。如

16、果表达式真的,SAS语句对正被创建的观测继续执行DATA步的语句。如果表达式是假的,SAS立即返回到DATA步的开始对其他观测执行。,例8.17 应用举例。data a;set ResDat.Idx000001;if _n_100;run;例中,选择前99条观测值。,GO TO语句与语句标号,GO TO语句使SAS跳到本程序步带有标号的语句继续往下执行。GO TO语句和指定的目标语句必须在同一DATA步。GO TO语句语句格式:GO TO label;GOTO label;Label选项规定语句标号来指示GO TO的目标。,例8.18 应用举例。data a;input x;if 1=x=5

17、then goto ok;put x;count+1;ok:sumx+x;cards;1 2 7 2 12 24 22;例中,COUNT仅对大于5的数计数,SUMX+X对每个观测都执行。,data a;input x;if 1=x=5 then goto ok;put x;count+1;return;ok:sumx+x;cards;1 2 7 2 12 24 22;run;例中,COUNT仅对大于5的数计数,SUMX+X仅对X在1和5之间的那些观测执行。,例8.19 上面两例中用DO-END语句替代GOTO语句。data a;input x;if x5 then do;put x;count

18、+1;end;sum+x;cards;1 2 7 2 12 24 22;data a;input x;if x5 then do;put x;count+1;end;else sumx+x;cards;1 2 7 2 12 24 22;,语句标号,语句标号给出GO TO,LINK,FILE语句中的选项HEADER=,或在INFILE语句中选项EOF=的位置。语句格式:LABEL:statement;,LINK语句,LINK语句告诉SAS系统立即转到由LINK语句指示的语句标号,并从那里继续执行直到一个RETURN语句。RETURN语句让SAS立即返回到LINK语句后面的那个语句并从那里继续执行

19、。LINK语句和语句标号所在的目标语句必须在同一个DATA步。语句格式LINK label;,例8.20 执行一组语句。data bydro;input type$wd station$;label type=station type wd=depth to water;elev=.;if type=aluy then link calcu;year=1985;return;calcu:if station=site_1 then elev=6650-wd;if station=site_2 then elev=5500-wd;return;/*返回到link语句下面的year=1985;语句

20、*/cards;aluv 523 site_1uppa 234 site_2aluy 666 site_2;,RETURN语句,RETURN语句告诉SAS系统在DATA步当前位置上停止执行语句,返回到一个预定位置上继续执行。语句格式RETURN;RETURN语句的作用:在LINK语句后面,RETURN语句让SAS系统立即返回到LINK后面的语句,并继续往下执行;在FILE语句的选项HEADER=中,RETURN语句让SAS系统立即返回到开始新页之前执行的最后一个语句后面的语句,并继续执行;在DATA步的其它地方,RETURN语句让SAS系统返回到DATA步开头。,例8.23 让SAS系统返回到

21、DATA步开头。data survey;input x y z;if x=y then return;x=y+z;a=x*2;cards;1 2 3 3 3 45 6 78 8 9;例中,当X=Y时,RETURN语句被执行。SAS系统添加这个观测到数据集SURVEY,并返回到DATA步的开头。IF语句后面的二个赋值语句没有被执行。,CONTINUE语句,CONTINUE语句停止当前的这次循环过程,继续进行下一次循环。语句格式:CONTINUE;,例8.25 CONTINUE语句停止当前的循环过程,继续进行下一次循环。data a;do i=1 to 5;input name$idno stat

22、us$;if status=PT then continue;/*返回到下次循环的开头*/input benefits$10.;output;end;cards;,/*接上页*/Jones 9011 PTThomas 876 PTRichards 1002 FTEye/DentalKelly 85111 PTSmith 433 FTHMOKelly 85111 PTSmith 433 FTHMOJones 9011 PTThomas 876 PTRichards 1002 FTEye/Dental;Run;,LEAVE 语句,LEAVE 语句停止当前DO组循环或SELECT组的处理过程,并继续

23、执行DO组或SELECT组后面的语句。语句格式:LEAVE;,例8.26 给定条件下停止DO循环的处理过程,data week;input name$idno start status$dept$;bonus=0;do year=start to 1991;if bonus ge 500 then leave;bonus+50;end;cards;,/*接上页*/Jones 9011 1990 PT PUBThomas 876 1976 PT HRBarnes 7899 1991 ft techHarrell 1250 1975 ft hrRichards 1002 1990 ft devKelly 85 1981 pt pubStone 091 1990 pt mait;Run;例中,首先由IF语句检查BONUS的值,当BONUS的值超过允许的最大值500时,用LEAVE语句来停止DO循环的处理过程,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号