1、第第7章数据步修改与选择观测章数据步修改与选择观测清华大学经管学院清华大学经管学院 朱世武朱世武本章介绍数据步中用于修改与选择观测的语句。利用修改与选择观测语句,可以进行数值计算、数据集修改、观测子集选择及输出控制等。赋值语句赋值语句 语句格式: variable=expression;将表达式结果赋予一个变量。 选项说明: variable规定变量名或数组元素expression有效的SAS表达式例7.1 赋值语句举例 data a;set ResDat.class;by sex;n=_N_; error=_error_; first_s=first.sex; last_s=last.sex
2、; proc print;run;x=a+b; /* 规定新变量x,它是a和b的和*/t(2)=sum(of x1-x5); /*规定数组元素,它的值是一函数值*/a=a+b; /*规定一个已经存在的变量a,它的值为原来值和b之和*/结果显示:Obs Name Sex Age Height Weight n error first_s last_s 1 Alice F 13 56.5 84.0 1 0 1 0 2 Barbara F 13 65.3 98.0 2 0 0 0 3 Carol F 14 62.8 102.5 3 0 0 0 4 Jane F 12 59.8 84.5 4 0 0
3、0 5 Janet F 15 62.5 112.5 5 0 0 0 6 Joyce F 11 51.3 50.5 6 0 0 0 7 Judy F 14 64.3 90.0 7 0 0 0 8 Louise F 12 56.3 77.0 8 0 0 0 9 Mary F 15 66.5 112.0 9 0 0 1 10 Alfred M 14 69.0 112.5 10 0 1 0 11 Henry M 14 63.5 102.5 11 0 0 0 结果变量类型结果变量类型 决定结果变量类型的准则: 如果表达式中的变量全为数值型,结果变量为数值型; 如果表达式中的变量全为字符型,结果变量为字符
4、型; 如果表达式中的变量既有数值又有字符型,结果变量为数值型。结果变量长度结果变量长度 结果变量的长度是第一次扫描结果的长度,除非事先由LENGTH语句规定好结果变量的长度。 例7.2 第一扫描结果的长度不是所有数据中的最大长度时会出错 data a;lstknm=深发展; /*第一扫描结果的长度为4 */lstknm =大秦铁路; /* lstknm的长度为4,所以显示结果为lstknm =大秦铁*/proc print;run;Obs lstknm-1 大秦铁例7.3 用LENGTH语句得到正确输出结果 data a;length lstknm $12; /* 规定变量lstknm的长度为
5、12 */lstknm=深发展; lstknm =大秦铁路; proc print;run;Obs lstknm-1 大秦铁路累加语句累加语句 语句格式: Variable+expression;累加语句累加表达式结果。 选项说明: variable规定累加变量expression有效的SAS表达式应用准则: 累加变量的观测被读入之前,值为0; 表达式的计算结果为缺失值时,取0代替; 表达式可以使用比较算符; 语句A+(-B)中的(+)是必须的,不能写成A-B。 例7.4 累加语句等于使用SUM函数和一个RETAIN语句data a (keep=name height s_h);set Res
6、Dat.class ;s_h+height;proc print;run;data b (keep=name height s_h);set fdata.class ;s_h=sum(s_h, height, 0); retain s_h 0; run;上面两段程序等价 Obs Name Height s_h1 Alice 56.5 56.52 Barbara 65.3 121.83 Carol 62.8 184.64 Jane 59.8 244.45 Janet 62.5 306.96 Joyce 51.3 358.27 Judy 64.3 422.58 Louise 56.3 478.89
7、 Mary 66.5 545.3 应用举例应用举例 例7.5 表达式SUMX+X*X把X*X的结果加到SUMX上 data a (keep=date uss);set ResDat. Dret(where =(stkcd=000002);uss+ Dret*2; /*USS为变量Dret的平方和 */run;例7.6 计算非缺失值的观测个数data a(keep=nmis);set ResDat.indcls;nmis+sector= ;run;例中,NMIS为变量SECTOR非缺失值的观测个数,即按SECTOR分好类股票的个数。 DELETE语句语句DELETE语句停止处理当前观测,该观测值
8、不被读入到创建的数据集,SAS系统返回到DATA步的开头处理其他观测。语句格式:DELETE; 例7.7 删除部分观测值 data stka;set ResDat.lstkinfo;if Stktype=B then delete;run;例中,删除数据集RESDAT中Stktype=B的观测值。例7.8 清空数据集 data a;set ResDat.lstkinfo;delete;run;例中,删除数据集A中的所有观测值,即清空数据集A。设计复杂程序时,常会用到DELETE语句的这种用法。LOSTCARD语句语句 LOSTCARD语句用于重新对准输入数据。当一个观测包含几个数据行,且当前观
9、测缺少其中的一些行时,利用LOSTCARD语句可以防止SAS系统从下一个观测的数据行读数据作为当前观测的一部分。语句格式LOSTCARD;使用LOSTCARD语句时,必须用IF-THEN语句给出丢失数据行的条件。适合使用LOSTCARD语句的情况有:每个观测有固定的输入数据行;同一个观测的每个数据行都有一个同值的识别变量。 例7.9 每个数据行都有一个同值的识别变量data a;input id 1-3 reject #2 idc 1-3 pass; if id ne idc then do;put 数据行错误 id= idc=;lostcard;end;cards;301 32301 614
10、32302 53302 83171400 92845411 46411 99551;proc print;title2 每个观测包含2个数据行;run; 每个观测包含两个数据行 Obs id reject idc pass 1 301 32 301 61432 2 302 53 302 83171 3 411 46 411 99551LOSTCARD语句的执行步骤:语句的执行步骤: SAS日志上输出一个丢失记录卡信息,一条标尺及创建当前观测所读的数据行; 不输出观测到数据集,丢弃开始读入本组的数据行,返回到DATA步开头; 试图用该组第二个数据行开始并按INPUT语句规定的行数读数据行来创建观
11、测; 当丢失记录行的IF条件仍是真的,SAS重复前三步; 对于IF条件不成立的一组数据行,SAS创建一个观测,并增加自动变量_N_的值。 例7.10 每个观测包含3个数据行 data a;input id1 x $ #2 id2 y $ # 3 id3 z $;if id1 ne id2 or id2 ne id3 then lostcard;cards;101 A102 B102 B103 C103 C103 C104 D105 E105 E105 E;proc print;title 每个观测包含3个数据行;run; 每个观测包含3个数据行 Obs id1 x id2 y id3 z1 1
12、03 C 103 C 103 C2 105 E 105 E 105 E例中,DATA步读3个数据行作为1个观测。第1个观测有2个丢失记录,第2个观测有1个丢失记录,第4个观测丢失2个记录。只有第3和第5个观测是完整的观测。LOG窗口显示的信息:NOTE: LOST CARD.RULE: -+-1-+-2-+-3-+-4-+-5-+-6-+-7-+-8-+-9-+-05 101 A6 102 B7 102 BNOTE: LOST CARD.8 103 CNOTE: LOST CARD.9 103 CNOTE: LOST CARD.11 104 D12 105 E13 105 ENOTE: 数据集
13、 WORK.A 有 2 个观测和 6 个变量。 STOP语句语句STOP语句停止处理DATA步。当遇到STOP语句时,正被处理的那个观测没有添加到SAS数据集上。语句格式:STOP; 例7.11 停止处理DATA步data a;set resdat.lstkinfo;if _n_=5 then stop;proc print; /*OUTPUT窗口照常打印数据集列表 */run;例中,数据集A从数据集resdat.lstkinfo中读取了4条观测,因为当指针标识_N_=5时,遇到STOP语句,正被处理的那条观测没有添加到数据集A中。ABORT语句语句 ABORT语句中止执行当前的DATA步,继
14、续执行下一个DATA或PROC步。执行ABORT语句时,创建ABORT语句执行前已处理观测的数据集。但是,当新创建数据集和已存在的SAS数据集同名时,不能覆盖已存在的数据集。 语句格式 :ABORT|; RETURN选项说明选项说明 立即使当前的SAS作业或会话正常结束。产生的结果依赖于执行的方式。批处理方式和非交互方式下: 立即停止处理; 在LOG窗口显示错误信息,说明由ABORT语句的RETURN选项终程序执行; 不执行任何相继的语句或检查句法; 用一个条件码指示有错误地控制返回到主机系统。 显示管理方式和交互行方式下: 立即停止处理并返回到主机系统。 例7.12 显示管理方式下使用sto
15、p语句与abort的区别。使用stop语句时,LOG窗口不显示错误信息,当新创建数据集和已存在的SAS数据集同名时,能覆盖已存在的数据集。data a;set resdat.lstkinfo;if _n_=5 then stop;run;Log窗口显示:NOTE: 从数据集 RESDAT.LSTKINFO 读取了 5 个观测。NOTE: 数据集 WORK.A 有 4 个观测和 12 个变量。NOTE: “DATA 语句”所用时间(总处理时间): 实际时间 0.35 秒 CPU 时间 0.01 秒使用abort语句时,LOG窗口显示错误信息,当新创建数据集和已存在的SAS数据集同名时,不能覆盖已
16、存在的数据集。data a;set resdat.lstkinfo;if _n_=5 then abort;run;Log窗口显示:ERROR: ABORT 语句在行 51 列 15 终止了执行。Stkcd=000007 Lstknm=深达声A Lstdt=1992-04-13NOTE: SAS 系统由于错误而停止了该步的处理。NOTE: 从数据集 RESDAT.LSTKINFO 读取了 5 个观测。WARNING: 数据集 WORK.A 可能不完整。该步停止时,共有 4 个观测和 12 个变量。WARNING: 数据集 WORK.A 由于该步已停止,而没有被替换。NOTE: “DATA 语句
17、”所用时间(总处理时间): 实际时间 0.01 秒 CPU 时间 0.02 秒例7.13 ABORT语句防止输入无效数据时出错。data b;input ssn pay ;if _error_ then abort;cards;111 100aaa 200444 300;proc print;run; 输出结果:Obs ssn pay 1 111 100 WHERE语句的性质语句的性质 WHERE语句读入数据集之前选择观测。WHERE语句是在执行数据集连接(SET),合并(MERGE),更新(UPDATE)或修改(MODIFY)之前进行的操作。使用WHERE语句时,因为SAS系统只从输入数据集
18、中读入满足条件的观测,所以这样的SAS程序更有效。WHERE语句不是可执行语句,它起不到IF-THEN语句的作用。能用WHERE语句的地方一定可以用IF语句来代替,反之则不行。不过,一旦WHERE语句有效,就一定要用它,因为这样的程序效率高。 语句格式语句格式WHERE where-expression;仅用于WHERE表达式的特殊算符 算符说明Between-And选择一定数值范围内的观测Is Missing|Is Null选择变量值为缺失值的所有观测Contains|?选择包含在规定字符串的观测Like匹配选择观测Same-And增加多个从句例7.15 BETWEEN-AND算符和IS M
19、ISSING|IS NULL算符例句。 Where hstocd between 600000 and 600899;Where taxes between salary*0.30 and salary*0.50;Where taxes not between salary*0.30 and salary*0.50;Where idnum is missing; /*计算缺失值数目 */Where name is null;LIKE算符的两个特殊模式: 百分号(%)可以替代任意多个字符; 下划线(_)正好有一个字符与之匹配。进行比较时,LIKE算符识别大写和小写之间的字符。 例7.16 设有名
20、字Diana,Diane, Dianna, Dianthus,Dyan. 使用LIKE算符来选择第一个字符为D的名字时,LIKE算符的不同选择模式与结果如下 :Like D_an; /* 选择Dyan */Like D_an_;/* 没有名子被选上 */Like D_an_; /* Diana, Diane, Dianna, Dyan */Like D_an%; /*上述列表的所有名字 */Not like D_an%; /* 没有名子被选上 */SAMEAND算符的形式:算符的形式:WHERE candition-1;其它SAS语句WHERE SAME AND condition -2其它S
21、AS语句WEHERE SAME AND condition-n;SAS系统选择除满足上述定义的条件外,还满足在SAME-AND算符后列出条件的观测。 例7.17 使用算符SAME-AND来增加较多的从句到程序中已有的WHERE语句后面,而不需要重新打入原来的从句proc gplot data=ResDat.Idx000001;plot clpr*date=1;where year(date)1996;where same and year(date)2000;run;quit;应用举例应用举例 例7.18 选择数值变量非0和非缺失的观测值 Where x;Where x and y; Wher
22、e x/y;例7.19 选择字符变量非缺失的观测 Where c= ; where c is not missing;字符变量C不能单独地作为逻辑表达式 例7.20 选择一定范围内的观测 Where x between 1 and 5; where 1=x=5;例7.22 不能用WHERE语句的情况 data a;set ResDat.Idx000001;where _n_100; /*错误语句,必须用错误语句,必须用if */run;data a;set ResDat.Idx000001;if _n_100;run;例中,不能用例中,不能用WHERE语句控制语句控制SAS的自动变量。的自动变
23、量。OUTPUT语句语句 OUTPUT语句输出当前的观测到被创建的数据集中。 语句格式语句格式OUTPUT ; 选项说明: OUTPUT语句的作用:由一个输入数据行创建多个观测;由一个输入数据文件创建多个SAS数据集;由几个输入数据行合并为一个观测。 没有选项将当前观测输出到DATA语句中命名的所有数据集中data-set-name规定输出当前观测的数据集应用举例应用举例 例7.23 由一个输入数据行创建多个观测 data A;input ID $ score1- score3;drop score1- score3;score=score1; output;score=score2; out
24、put;score=score3; output;cards;02126 99 96 9402128 89 90 88;proc print;run;例中,每一行记录生成三个观测。每个新观测将包括代号ID和一次测验值SCORE. Obs ID score1 02126 992 02126 963 02126 944 02128 895 02128 906 02128 88例7.24 一个DATA步创建多个数据集 data A B;set ResDat.lstkinfo;if Stktype=A then output Astk;else if Stktype=B then output bst
25、k;run;例中,一个DATA步创建两个数据集。数据集Astk包含变量Stktype=A的所有观测;数据集Bstk包含变量Stktype=B的所有观测。例例7.27.26 6 由几个记录组合信息 proc sort data=ResDat.lstkinfo out=lstkinfo;by stktype;data a;set lstkinfo ;by stktype;if first. Stktype then Num=0;Num+1;keep stktype num ;if last.stktype then output;run;例中,计算数据集lstkinfo中两类不同股票的数目。这样的
26、方法是不是简单快捷。这个例子很有用,从这里也认识了自动变量:first. stktype 和last. stktype的使用方法。数据处理时用这个语句会很省力。MISSING语句语句 MISSING语句规定缺失值的符号。读入含有缺失值的数据源时,必须用MISSING语句,否则可能产生读入错误。 语句格式语句格式Missing charcter1charctern; 其中:charcter规定代表缺失值的字符。 应用举例应用举例 例7.29 规定缺失值字符 data period_a;missing X I;input Id $4. Foodpr1 Foodpr2 Foodpr3 Coffeem
27、1 Coffeem2;datalines;1001 115 45 65 I 781002 86 27 55 72 861004 93 52 X 76 881015 73 35 43 112 1081027 101 127 39 76 79;例中,MISSING语句规定用字符X和I表示缺失值。如果不用MISSING语句,当读入数值变量的缺失值时(这里为X和I),就要产生错误。 Id Foodpr1 Foodpr2 Foodpr3 Coffeem1Coffeem210011154565 I 781002862755 72 8610049352X 76 881015733543 112 108102
28、710112739 76 79其它语句其它语句 本节介绍语句LIST, CALL, NULL和ERROR. LIST语句语句 LIST语句在SAS日志窗口上列出正被加工处理观测的输入数据行。 LIST语句被执行时,在列出的第一行记录之前,显示一条指示列数的标尺。语句格式 LIST; 例7.30 用INPUT语句读入可疑数据行时使用LIST语句data a;input x y;if x0 then list;cards;2 6 4 2-1 2 -4 6;run; 290 data a;291 input x y;292 if x0 then list;293 cards;RULE: -+-1-+
29、-2-+-3-+-4-+-5-+-6-296 -1 2297 -4 6NOTE: 数据集 WORK.A 有 4 个观测和 2 个变量。NOTE: “DATA 语句”所用时间(总处理时间): 实际时间 0.00 秒 CPU 时间 0.00 秒298 ;299 run;LOG显示结果CALL语句语句 CALL语句用于调用子程序。语句格式:Call routine (parameter-1);选项说明: Routine规定要调用的子程序Parameter传递给子程序信息的参数或变量名等例7.32 创建包含DATA信息的宏变量 data a;call symput (text1, march); /*
30、将march赋给宏变量text1 */call symput (beta, 100); /*将100赋给宏变量beta */run;例7.33 发布操作系统命令 NULL语句语句 空语句是一个分号(;),用于固定位置。SAS系统用一个分号(;)或四个分号(;)来接受空语句。 一个分号(;)表示CARDS(或DATALINES)语句后数据行的结束。 四个分号(;)表示CARDS4(或DATALINES4)语句后数据行的结束。 虽然空语句没有执行动作,但它是可执行语句。 例7.34 空语句表示数据行结束data a;input x y z;if x=. Then goto find;list;fi
31、nd : ;drop x;cards;1 2 5. 1 32 5 8. 3 9;proc print;run;在这个DATA步,CARDS语句告诉SAS 系统在这个作业流中,紧跟着的是数据行,当SAS遇到空语句(;)时,就知道数据行结束了。上例中的空语句也可以省略,因数据行后面第一个语句(PROC PRINT;)中包含一个分号。输出窗口显示结果Obs y z1 2 52 1 33 5 84 3 9ERROR语句语句 ERROR语句置自动变量_error_为1,并有选择地输出用户规定的一段信息到SAS的记录窗口。语句格式:ERROR ;选项说明: 没有选项 规定_ERROR_为1,但没有在LOG
32、窗口输出任何信息Message规定输出的信息ERROR语句等价于下面一系列语句: 赋值语句置_ERROR_为1; 一个FILE LOG语句; PUT语句规定一段信息; 新的一个FILE语句重新设置前一个FILE 语句的设置。例7.35 应用举例 data a;input name $ type $ age ;if type=teen & age 19 then error type and age dont macth age=;cards;Wu teen 20Li teen 12Cindy adult 28;314 data a;315 input name $ type $ age ;31
33、6 if type=teen & age 19 then error type and age dont macth age=;317 cards;type and age dont macthage=20RULE: -+-1-+-2-+-3-+-4-+-5-+-6-+-7-+-8-318 Wu teen 20name=Wu type=teen age=20 _ERROR_=1 _N_=1NOTE: 数据集 WORK.A 有 3 个观测和 3 个变量。NOTE: “DATA 语句”所用时间(总处理时间): 实际时间 0.01 秒 CPU 时间 0.01 秒321 ;LOG窗口显示data a;
34、input name $ type $ age ;if type=teen & age 19 then do;put type and age dont macth age=;_error_=1;end;cards;Wu teen 20Li teen 12Cindy adult 28;run;上面程序与前一页程序结果相同。第一段用ERROR语句,第二段用PUT和_ERROR_语句。另外,可以通过FILE语句改变输出错误信息的地点。 第第8章章 数据步循环与转移控制数据步循环与转移控制清华大学经管学院清华大学经管学院 朱世武朱世武ZResdat样本数据:样本数据:SAS论坛:论坛: DO语句语句
35、 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;3
36、31 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 h_cm=169.02083333NOTE: 从数据集
37、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=sp
38、ecification-1;一些SAS语句END;其中:index-variable选项定义下标变量,用于控制DO组的执行方式和重复次数。下标变量包含在创建的数据集中,可以用DROP语句删除。 SPECIFICATION选项格式选项格式 Start ; Specification选项说明: Start规定下标变量的起始值To Stop规定下标变量的终止值Increment规定步长While Expression表达式在每次循环执行前计算Until Expression表达式在每次循环执行以后计算例8.2 缺省的步长为1。do I=1 to 1000;do I=1 to y+3;do I=1 t
39、o 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;例句子中,起始值必须全部是数值或全部是字符常数,也可以是变量。字符常数必须用引号括起来。
40、 例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
41、=;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; WHEN(when-expression-1) statement; END; 选项说明: select-expression选择
42、表达式when-expression规定任意有效的一个SAS表达式。Statement任意可执行的SAS语句应用举例应用举例 例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,1
43、7时,执行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,j
44、un,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=janfall or wintermon=febspring mon=marspring mon=aprspring mon=maysummer mon=junsummer mon=julsummer
45、 mon=augfall or wintermon=sepNOTE: “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
46、-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 thenif y ne 0 then put x zero, y nozero;else put x zero, y zero;else put x nozero;if ans=9 thendo
47、; 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_100;run;例中,选择前99条观测值。GO TO语句与语句标号语句与语句标号
48、 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 then goto ok;put x; count+1; ok: sumx+x;cards;1 2 7 2 12 24 22;例中,COUNT仅对大于5的数计数,SUMX+X对每个观测都执行。 xcountsumx1101220337110421125122246243487224
49、70data 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之间的那些观测执行。 xcountsumx1101220337134215512256243572245例8.19 上面两例中用DO-END语句替代GOTO语句。data a;input x ;if x5 then do;put x; count+1;end;sum+x;cards;1 2 7 2 12 24 22;data a;inp
50、ut 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步。 语句格式