08数据步循环与转移控制

更新时间:2023-07-27 18:12:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

朱世武SAS教程(精品)

第8章 数据步循环与转移控制清华大学经管学院 朱世武 Zhushw@ Resdat样本数据: SAS论坛:

朱世武SAS教程(精品)

DO语句 DO语句必须由一个END语句来结束。 DO和END语句之间的这些语句称为一个DO组。 DO组可以嵌套任意次。 DO语句有5类: 简单DO语句; 循环DO语句; DO OVER语句; DO WHILE语句; DO UNTIL语句。

朱世武SAS教程(精品)

简单DO语句语句格式 DO; [一些SAS语句] END;

朱世武SAS教程(精品)

应用举例例8.1 IF/THEN语句用中DO. data a; set ResDat.class; if age>14 then do; h_cm=30.5*height/12; put name= sex= age= h_cm=; end; run;

朱世武SAS教程(精品)

329 330 331 332 333 334 335

data a; set fdata.class; if age>14 then do; h_cm=30.5*height/12; put name= sex= age= h_cm=; end; 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 age>14 then H_cm=30.5*height/12; If age>14 then Put name= sex= age= h_cm=;

朱世武SAS教程(精品)

循环DO语句DO组中的语句需要被重复执行时要用到循环DO语句。 循环DO语句根据下标变量重复执行DO和END语句之间的语句 语句格式 DO index_variable=specification-1<,…specification-N>; [一些SAS语句] END; 其中: index-variable选项定义下标变量,用于控制DO组的执行方式和重 复次数。 下标变量包含在创建的数据集中,可以用DROP语句删除。

朱世武SAS教程(精品)

SPECIFICATION选项格式Start <TO stop> <BY increment> <WHILE/UNTIL(expression)>; Specification选项说明:Start To Stop Increment While Expression Until Expression 规定下标变量的起始值 规定下标变量的终止值 规定步长 表达式在每次循环执行前计算 表达式在每次循环执行以后计算

朱世武SAS教程(精品)

例8.2 缺省的步长为1。 do I=1 to 1000; do I=1 to y+3; do I=1 to exit;

朱世武SAS教程(精品)

例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='01jan99'd, '25feb99'd; do i='01jan99'd to '01jan2000'd by 1; 例句子中,起始值必须全部是数值或全部是字符常数,也可以是 变量。字符常数必须用引号括起来。

朱世武SAS教程(精品)

例8.4 使用表达式选项。 do i=1 to 10 while(x<y); do i=2 to 20 by 2 until((x/3)>y); do i=10 to 0 by –1 while(month='jan');

朱世武SAS教程(精品)

应用举例例8.5 用GO TO语句跳出循环体。data a; input x y; if x>y then goto skip; /*skip是循环体外 的语句标号*/ y=log(y-x); yy=y-20; skip: if y<0 then do; 数据集a put x= y=; z=log(x-y); x y end; 1 2 1.3862943611 cards; 2

6 2 5 3 53 5 -1 3 5 -1

yy

z

-18.61370564 . . . . 1.7917594692

;

朱世武SAS教程(精品)

LOG窗口显示:336 337 338 339 340 341 342 343 344 345 data a; input x y; if x>y then goto skip; /*skip是循环体外的语句标号*/ y=log(y-x); yy=y-20; skip: if y<0 then do; put x= y=; z=log(x-y); end; cards;

x=5 y=-1 NOTE: 数据集 WORK.A 有 3 个观测和 4 个变量。 NOTE: “DATA 语句”所用时间(总处理时间): 实际时间 0.04 秒 CPU 时间 0.01 秒

349 ; 350 run;

朱世武SAS教程(精品)

例8.6 产生指定观测值个数的数据集。 data a; do n=1 to 100 ; output; end; run; 例中,产生一个含有100个观测值的数据集。

朱世武SAS教程(精品)

例8.7 自然数求和。 data a; t=0; do n=1 to 100 ; t=t+n; output; end; run; 例中,求1到100的自然数之和。

朱世武SAS教程(精品)

例8.9 用循环DO语句处理数组。 array day{7} d1-d7; /*定义数组day{7} */ do i=1 to 7; if day{i}=99 then day{i}=100; end; 例中,用循环DO语句处理数组时,便于进行批量更新。

朱世武SAS教程(精品)

DO OVER语句DO OVER语句对隐含下标数组元素执行DO组里的语 句。 语句格式 DO OVER array-name; [若干SAS语句] END; 其中: 选项array-name规定一个隐含下标数组。

朱世武SAS教程(精品)

应用举例例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 .99 .77 .56 ; run;

sc01 1 95

sc02 88

sc03 99

sc04 77

sc05 56

朱世武SAS教程(精品)

DO WHILE语句DO WHILE语句使得当条件成立时重复地执行DO组中 的语句。 语句格式 DO WHILE (expression); 选项expression规定任一有效表达式。

朱世武SAS教程(精品)

应用举例例8.11 当N值小于5时重复执行DO组中的语句。 data a; n=0 ; do while(n lt 5); put n=; n+1; end; run;

本文来源:https://www.bwwdw.com/article/1fjm.html

Top