资源预览内容
第1页 / 共103页
第2页 / 共103页
第3页 / 共103页
第4页 / 共103页
第5页 / 共103页
第6页 / 共103页
第7页 / 共103页
第8页 / 共103页
第9页 / 共103页
第10页 / 共103页
亲,该文档总共103页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章 数据步修改与选择观测清华大学经管学院 朱世武本章介绍数据步中用于修改与选择观测的语句。利用修改与选择观测语句,可以进行数值计算、数 据集修改、观测子集选择及输出控制等。赋值语句 语句格式: variable=expression;将表达式结果赋予一个变量。选项说明: 例7.1 赋值语句举例 data a; set ResDat.class; by sex; n=_N_; error=_error_; first_s=first.sex; last_s=last.sex; 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 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 结果变量类型 决定结果变量类型的准则: 如果表达式中的变量全为数值型,结果变量为数 值型; 如果表达式中的变量全为字符型,结果变量为字 符型; 如果表达式中的变量既有数值又有字符型,结果 变量为数值型。结果变量长度 结果变量的长度是第一次扫描结果的长度,除非事先由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的长度为12 */ lstknm=深发展; lstknm =大秦铁路; proc print; run;Obs lstknm- 1 大秦铁路累加语句 语句格式: Variable+expression;累加语句累加表达式结果。选项说明: 应用准则: 累加变量的观测被读入之前,值为0; 表达式的计算结果为缺失值时,取0代替; 表达式可以使用比较算符; 语句A+(-B)中的(+)是必须的,不能写成A- B。 例7.4 累加语句等于使用SUM函数和一个RETAIN语句 data a (keep=name height s_h); set ResDat.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_h 1 Alice 56.5 56.5 2 Barbara 65.3 121.8 3 Carol 62.8 184.6 4 Jane 59.8 244.4 5 Janet 62.5 306.9 6 Joyce 51.3 358.2 7 Judy 64.3 422.5 8 Louise 56.3 478.8 9 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语句停止处理当前观测,该观测值不被 读入到创建的数据集,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语句用于重新对准输入数据。 当一个观测包含几个数据行,且当前观测缺少其中的一些行 时,利用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 32 301 61432 302 53 302 83171 400 92845 411 46 411 99551 ; proc print; title2 每个观测包含2个数据行; run; 每个观测包含两个数据行Obs id reject idc pass1 301 32 301 614322 302 53 302 831713 411 46 411 99551LOSTCARD语句的执行步骤: SAS日志上输出一个丢失记录卡信息,一条标尺及创 建当前观测所读的数据行; 不输出观测到数据集,丢弃开始读入本组的数据行, 返回到DATA步开头; 试图用该组第二个数据行开始并按INPUT语句规定的 行数读数据行来创建观测; 当丢失记录行的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 A 102 B 102 B 103 C 103 C 103 C 104 D 105 E 105 E 105 E ; proc print; title 每个观测包含3个数据行; run;每个观测包含3个数据行 Obs id1 x id2 y id3 z1 103 C 103 C 103 C 2 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-+-0 5 101 A 6 102
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号