数据步修改与选择观测

上传人:san****019 文档编号:20665578 上传时间:2021-04-11 格式:PPT 页数:54 大小:1.95MB
返回 下载 相关 举报
数据步修改与选择观测_第1页
第1页 / 共54页
数据步修改与选择观测_第2页
第2页 / 共54页
数据步修改与选择观测_第3页
第3页 / 共54页
点击查看更多>>
资源描述
第 7章 数据步修改与选择观测 清华大学经管学院 朱世武 Z Resdat样本数据: SAS论坛: 本章介绍数据步中用于修改与选择观测的语句。 利用修改与选择观测语句,可以进行数值计算、数 据集修改、观测子集选择及输出控制等。 赋值语句 语句格式: variable=expression; 将表达式结果赋予一个变量。 选项说明: v a r i a b l e 规定变量名或数组元素 e x p r e s s i o n 有效的 S A S 表达式 例 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; 累加语句累加表达式结果。 选项说明: v a r i a b l e 规定累加变量 e x p r e s s i o n 有效的 S A S 表达式 应用准则: 累加变量的观测被读入之前 , 值为 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 pass 1 301 32 301 61432 2 302 53 302 83171 3 411 46 411 99551 LOSTCARD语句的执行步骤: 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 z 1 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 B 7 102 B NOTE: LOST CARD. 8 103 C NOTE: LOST CARD. 9 103 C NOTE: LOST CARD. 11 104 D 12 105 E 13 105 E NOTE: 数据集 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步,继续执行下一个 DATA或 PROC步。 执行 ABORT语句时,创建 ABORT语句执行前已处理观测的数据 集。但是,当新创建数据集和已存在的 SAS数据集同名时,不能 覆盖已存在的数据集。 语句格式 : ABORT|; RETURN选项说明 立即使当前的 SAS作业或会话正常结束。产生的结果依赖 于执行的方式。 批处理方式和非交互方式下: 立即停止处理; 在 LOG窗口显示错误信息 ,说明由 ABORT语句的 RETURN选项终程序执行; 不执行任何相继的语句或检查句法; 用一个条件码指示有错误地控制返回到主机系统。 显示管理方式和交互行方式下: 立即停止处理并返回到主机系统。 例 7.12 显示管理方式下使用 stop语句与 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数据集同名时,不能覆盖已存在的数据集。 data a; set resdat.lstkinfo; if _n_=5 then abort; run; Log窗口显示: ERROR: ABORT 语句在行 51 列 15 终止了执行。 Stkcd=000007 Lstknm=深达声 A Lstdt=1992-04-13 NOTE: SAS 系统由于错误而停止了该步的处理。 NOTE: 从数据集 RESDAT.LSTKINFO 读取了 5 个观测。 WARNING: 数据集 WORK.A 可能不完整。该步停止时,共有 4 个观测和 12 个变量。 WARNING: 数据集 WORK.A 由于该步已停止,而没有被替换。 NOTE: “DATA 语句 ” 所用时间(总处理时间) : 实际时间 0.01 秒 CPU 时间 0.02 秒 例 7.13 ABORT语句防止输入无效数据时出错。 data b; input ssn pay ; if _error_ then abort; cards; 111 100 aaa 200 444 300 ; proc print; run; 输出结果: Obs ssn pay 1 111 100 WHERE语句的性质 WHERE语句读入数据集之前选择观测 。 WHERE语句是在执行数据集连接 ( SET) , 合并 ( MERGE) , 更新 ( UPDATE) 或修改 ( MODIFY) 之 前进行的操作 。 使用 WHERE语句时 , 因为 SAS系统只从输入数据集中 读入满足条件的观测 , 所以这样的 SAS程序更有效 。 WHERE语句不是可执行语句 , 它起不到 IF-THEN语句 的作用 。 能用 WHERE语句的地方一定可以用 IF语句来代替,反 之则不行。不过,一旦 WHERE语句有效,就一定要用 它,因为这样的程序效率高。 语句格式 WHERE where-expression; 仅用于 WHERE表达式的特殊算符 算符 说明 B e t w e e n- A nd 选择一定数值范围内的观测 I s M i s s i ng | I s N ul l 选择变量值为缺失值的所有观测 C on t a i ns | ? 选择包含在规定字符串的观测 L i ke 匹配选择观测 S a me - A nd 增加多个从句 例 7.15 BETWEEN-AND算符和 IS MISSING|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 设有名字 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 其它 SAS语句 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; Where 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的自动变量。 OUTPUT语句 OUTPUT语句输出当前的观测到被创建的数据集中。 语句格式 OUTPUT ; 选项说明: OUTPUT语句的作用: 由一个输入数据行创建多个观测; 由一个输入数据文件创建多个 SAS数据集; 由几个输入数据行合并为一个观测。 没有选项 将当前观测输出到 D A T A 语句中命名的所有数据集中 d a ta - s e t- n a m e 规定输出当前观测的数据集 应用举例 例 7.23 由一个输入数据行创建多个观测 data A; input ID $ score1- score3; drop score1- score3; score=score1; output; score=score2; output; score=score3; output; cards; 02126 99 96 94 02128 89 90 88 ; proc print; run; 例中,每一行记录生成三个观测。每个新 观测将包括代号 ID和一次测验值 SCORE. Obs ID score 1 02126 99 2 02126 96 3 02126 94 4 02128 89 5 02128 90 6 02128 88 例 7.24 一个 DATA步创建多个数据集 data A B; set ResDat.lstkinfo; if Stktype=A then output Astk; else if Stktype=B then output bstk; run; 例中,一个 DATA步创建两个数据集。数据集 Astk 包含变量 Stktype=A的所有观测;数据集 Bstk包含 变量 Stktype=B的所有观测。 例 7.26 由几个记录组合信息 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中两类不同股票的数目。这样的 方法是不是简单快捷。这个例子很有用,从这里也认识了 自动变量: first. stktype 和 last. stktype的使用方法。数据处 理时用这个语句会很省力。 MISSING语句 MISSING语句规定缺失值的符号 。 读入含有缺失值的数据源时,必须用 MISSING语句,否 则可能产生读入错误。 语句格式 Missing charcter1 charctern; 其中: charcter规定代表缺失值的字符。 应用举例 例 7.29 规定缺失值字符 data period_a; missing X I; input Id $4. Foodpr1 Foodpr2 Foodpr3 Coffeem1 Coffeem2; datalines; 1001 115 45 65 I 78 1002 86 27 55 72 86 1004 93 52 X 76 88 1015 73 35 43 112 108 1027 101 127 39 76 79 ; 例中, MISSING语句规定用字符 X和 I表示缺失值。如果不用 MISSING语 句,当读入数值变量的缺失值时(这里为 X和 I), 就要产生错误。 Id Foodpr1 Foodpr2 Foodpr3 Coffeem1 Coffeem2 1001 115 45 65 I 78 1002 86 27 55 72 86 1004 93 52 X 76 88 1015 73 35 43 112 108 1027 101 127 39 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-+-2-+-3-+-4-+-5-+-6- 296 -1 2 297 -4 6 NOTE: 数据集 WORK.A 有 4 个观测和 2 个变量。 NOTE: “DATA 语句”所用时间(总处理时间) : 实际时间 0.00 秒 CPU 时间 0.00 秒 298 ; 299 run; LOG显示结果 CALL语句 CALL语句用于调用子程序 。 语句格式: Call routine (parameter-1); 选项说明: R o u ti n e 规定要 调用 的子程序 P a r a m e te r 传递给子程序信息的参数或变量名等 例 7.32 创建包含 DATA信息的宏变量 data a; call symput (text1, march); /*将 march赋给宏变量 text1 */ call symput (beta, 100); /*将 100赋给宏变量 beta */ run; 例 7.33 发布操作系统命令 data _null_; call system(dir *.sas); /*发布和操作系统命令 dir *.sas */ run; NULL语句 空语句是一个分号 (;), 用于固定位置 。 SAS系统用一个 分号 ( ; ) 或四个分号 ( ; ) 来接受空语句 。 一个分号 ( ; ) 表示 CARDS( 或 DATALINES) 语句后 数据行的结束 。 四个分号 ( ; ) 表示 CARDS4( 或 DATALINES4 ) 语句后数据行的结束 。 虽然空语句没有执行动作,但它是可执行语句。 例 7.34 空语句表示数据行结束 data a; input x y z; if x=. Then goto find; list; find : ; drop x; cards; 1 2 5 . 1 3 2 5 8 . 3 9 ; proc print; run; 在这个 DATA步, CARDS语句告诉 SAS 系统在这个作业流中,紧跟着的是数据行, 当 SAS遇到空语句( ;)时,就知道数据行结束了。上例中的空语句也可以省略,因 数据行后面第一个语句( PROC PRINT;) 中包含一个分号。 输出窗口显示结果 Obs y z 1 2 5 2 1 3 3 5 8 4 3 9 ERROR语句 ERROR语句置自动变量 _error_为 1, 并有选择地输出 用户规定的一段信息到 SAS的记录窗口 。 语句格式: ERROR ; 选项说明: 没有选项 规 定 _ E R R O R _ 为 1 , 但 没 有 在 L O G 窗口输出任何信息 M e s s a g e 规定输出的信息 ERROR语句等价于下面一系列语句: 赋值语句置 _ERROR_为 1; 一个 FILE LOG语句; PUT语句规定一段信息; 新的一个 FILE语句重新设置前一个 FILE 语句的设置。 例 7.35 应用举例 data a; input name $ type $ age ; if type=teen cards; Wu teen 20 Li teen 12 Cindy adult 28 ; 314 data a; 315 input name $ type $ age ; 316 if type=teen 317 cards; type and age dont macthage=20 RULE: -+-1-+-2-+-3-+-4-+-5-+-6-+-7-+-8- 318 Wu teen 20 name=Wu type=teen age=20 _ERROR_=1 _N_=1 NOTE: 数据集 WORK.A 有 3 个观测和 3 个变量。 NOTE: “DATA 语句”所用时间(总处理时间) : 实际时间 0.01 秒 CPU 时间 0.01 秒 321 ; LOG窗口显示 data a; input name $ type $ age ; if type=teen put type and age dont macth age=; _error_=1; end; cards; Wu teen 20 Li teen 12 Cindy adult 28 ; run; 上面程序与前一页程序结果相同。第一段用 ERROR语句,第 二段用 PUT和 _ERROR_语句。另外,可以通过 FILE语句改变 输出错误信息的地点。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!