资源预览内容
第1页 / 共114页
第2页 / 共114页
第3页 / 共114页
第4页 / 共114页
第5页 / 共114页
第6页 / 共114页
第7页 / 共114页
第8页 / 共114页
第9页 / 共114页
第10页 / 共114页
亲,该文档总共114页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第8章 数据步循环与转移控制清华大学经管学院 朱世武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;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.85416667 Name=Mary Sex=F Age=15 h_cm=169.02083333 Name=Philip Sex=M Age=16 h_cm=183 Name=Ronald Sex=M Age=15 h_cm=170.29166667 Name=William Sex=M Age=15 h_cm=169.02083333 NOTE: 从数据集 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语句之间的语句 语句格式 DO 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 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 a; input x y; if xy then goto skip; /*skip是循环体外 的语句标号*/ y=log(y-x); yy=y-20; skip: if yy then goto skip; /*skip是循环体外的语句标号*/ 339 y=log(y-x); 340 yy=y-20; 341 skip: if y=5时停止。 data a; n=0; do until(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; 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; select; 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 otherwise put fall or winter mon=; 367 end; 368 end; 369 run;fall or wintermon=jan fall or wintermon=feb spring mon=mar spring mon=apr spring mon=may summer mon=jun summer mon=jul summer mon=aug fall or wintermon=sep NOTE: “DATA 语句”所用时间(总处理时间):实际时间 0.03 秒CPU 时间 0.01 秒例8.15 SELECT组的正确及错误用法举例。select(x); when (x=2) put 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=OK and type=3 then count+1; if age ne agecheck then delete; if x=0 then if y ne 0 then put x zero, y nozero; else put x zero, y zero; else put x nozero; if ans=9 then do; ans=. ; put invalid answer for id=; end; else do; /*当IF条件不成立时,执行下面另一DO组 */ ans=ans1; valid+1; end;子集IF语句 语句格式: IF expression;其中: expression是任意有效的表达式。 如果表达式真的,SAS语句对正被创建的观测继续执 行DATA步的语句。如果表达式是假的,SAS立即返回 到DATA步的开始对其他观测执行。 例8.17 应用举例。 data a; set ResDat.Idx000001; if _n_5 then do; put x; count+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语句后面的那个语 句并从那里继续执行。 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;语句*/ cards; aluv 523 site_1 uppa 234 site_2 aluy 666 site_2 ;typewdstationelevyear1aluv523site_1.19852uppa234site_2.1985 3aluy666site_248341985RETURN语句RETURN语句告诉SAS系统在DATA步当前位置上停止执行语 句,返回到一个预定位置上继续执行。 语句格式 RETURN;RETURN语句的作用: 在LINK语句后面,RETURN语句让SAS系统立即返回到 LINK后面的语句,并继续往下执行; 在FILE语句的选项HEADER=中,RE
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号