SAS编程技术数据步修改与选择观测_第1页
SAS编程技术数据步修改与选择观测_第2页
SAS编程技术数据步修改与选择观测_第3页
SAS编程技术数据步修改与选择观测_第4页
SAS编程技术数据步修改与选择观测_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SAS编程技术数据步修改与选择观测SAS编程技术数据步修改与选择观测本章介绍数据步中用于修改与选择观测的语句。利用修改与选择观测语句,可以进行数值计算、数据集修改、观测子集选择及输出控制等。赋值语句赋值语句 语句格式: variable=expression;将表达式结果赋予一个变量。 选项说明: 例7.1 赋值语句举例 data a;set ;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);

2、/*规定数组元素,它的值是一函数值*/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

3、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的长度为12 */lstknm=深发展; lstknm =大秦铁路; proc print;run;Obs lstknm-1 大秦铁路

5、累加语句累加语句 语句格式: Variable+expression;累加语句累加表达式结果。 选项说明: 应用准则: 累加变量的观测被读入之前,值为0; 表达式的计算结果为缺失值时,取0代替; 表达式可以使用比较算符; 语句A+(-B)中的(+)是必须的,不能写成A-B。 例7.4 累加语句等于使用SUM函数和一个RETAIN语句data a (keep=name height s_h);set ;s_h+height;proc print;run;data b (keep=name height s_h);set ;s_h=sum(s_h, height, 0); retain s_h 0

6、; run;上面两段程序等价 Obs Name Height s_h1 Alice 56.5 应用举例应用举例 例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 ;nmis+sector= ;run;例中,NMIS为变量SECTOR非缺失值的观测个数,即按SECTOR分好类股票的个数。 DELETE语句语句DELE

7、TE语句停止处理当前观测,该观测值不被读入到创建的数据集,SAS系统返回到DATA步的开头处理其他观测。语句格式:DELETE; 例7.7 删除部分观测值 data stka;set ;if Stktype=B then delete;run;例中,删除数据集RESDAT中Stktype=B的观测值。例7.8 清空数据集 data a;set ;delete;run;例中,删除数据集A中的所有观测值,即清空数据集A。设计复杂程序时,常会用到DELETE语句的这种用法。LOSTCARD语句语句 LOSTCARD语句用于重新对准输入数据。当一个观测包含几个数据行,且当前观测缺少其中的一些行时,利用

8、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 61432302 53302 8

9、3171400 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语句规定的行数读数据行来创建观测; 当丢失记录行的IF条

10、件仍是真的,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 103 C 103 C 10

11、3 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: 数据集 WORK.A 有 2 个

12、观测和 6 个变量。 STOP语句语句STOP语句停止处理DATA步。当遇到STOP语句时,正被处理的那个观测没有添加到SAS数据集上。语句格式:STOP; 例7.11 停止处理DATA步data a;set ;if _n_=5 then stop;proc print; /*OUTPUT窗口照常打印数据集列表 */run;例中,数据集A从数据集中读取了4条观测,因为当指针标识_N_=5时,遇到STOP语句,正被处理的那条观测没有添加到数据集A中。ABORT语句语句 ABORT语句中止执行当前的DATA步,继续执行下一个DATA或PROC步。执行ABORT语句时,创建ABORT语句执行前已处理

13、观测的数据集。但是,当新创建数据集和已存在的SAS数据集同名时,不能覆盖已存在的数据集。 语句格式 :ABORT|; RETURN选项说明选项说明 立即使当前的SAS作业或会话正常结束。产生的结果依赖于执行的方式。批处理方式和非交互方式下: 立即停止处理; 在LOG窗口显示错误信息,说明由ABORT语句的RETURN选项终程序执行; 不执行任何相继的语句或检查句法; 用一个条件码指示有错误地控制返回到主机系统。 显示管理方式和交互行方式下: 立即停止处理并返回到主机系统。 例7.12 显示管理方式下使用stop语句与abort的区别。使用stop语句时,LOG窗口不显示错误信息,当新创建数据集

14、和已存在的SAS数据集同名时,能覆盖已存在的数据集。data a;set ;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 ;if _n_=5 then abort;run;Log窗口显示:ERROR:

15、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 语句”所用时间(总处理时间): 实际时间 0.01 秒 CPU 时间 0.02 秒例7.13 ABORT语句防止输入无效数据时出错。data b;in

16、put 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系统只从输入数据集中读入满足条件的观测,所以这样的SAS程序更有效。WHERE语句不是可执行语句,它起不到IF-THEN语句的作用。能用WHERE语句的地方一定可以

17、用IF语句来代替,反之则不行。不过,一旦WHERE语句有效,就一定要用它,因为这样的程序效率高。 语句格式语句格式WHERE where-expression;仅用于WHERE表达式的特殊算符 例5 BETWEEN-AND算符和IS MISSING|IS NULL算符例句。 Where hstocd between 600000 and 600899;Where taxes between salary* and salary*;Where taxes not between salary* and salary*;Where idnum is missing; /*计算缺失值数目 */Whe

18、re name is null;LIKE算符的两个特殊模式: 百分号(%)可以替代任意多个字符; 下划线(_)正好有一个字符与之匹配。进行比较时,LIKE算符识别大写和小写之间的字符。 例6 设有名字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

19、like D_an%; /* 没有名子被选上 */SAMEAND算符的形式:算符的形式:WHERE candition-1;其它SAS语句WHERE SAME AND condition -2其它SAS语句WEHERE SAME AND condition-n;SAS系统选择除满足上述定义的条件外,还满足在SAME-AND算符后列出条件的观测。 例7 使用算符SAME-AND来增加较多的从句到程序中已有的WHERE语句后面,而不需要重新打入原来的从句proc gplot data=ResDat.Idx000001;plot clpr*date=1;where year(date)202X;wh

20、ere same and year(date)202X;run;quit;应用举例应用举例 例8 选择数值变量非0和非缺失的观测值 Where x;Where x and y; Where x/y;例9 选择字符变量非缺失的观测 Where c= ; where c is not missing;字符变量C不能单独地作为逻辑表达式 例7.20 选择一定范围内的观测 Where x between 1 and 5; where 1=x=5;例2 不能用WHERE语句的情况 data a;set ResDat.Idx000001;where _n_100; /*错误语句,必须用错误语句,必须用if

21、 */run;data a;set ResDat.Idx000001;if _n_100;run;例中,不能用例中,不能用WHERE语句控制语句控制SAS的自动变量。的自动变量。OUTPUT语句语句 OUTPUT语句输出当前的观测到被创建的数据集中。 语句格式语句格式OUTPUT ; 选项说明: OUTPUT语句的作用:由一个输入数据行创建多个观测;由一个输入数据文件创建多个SAS数据集;由几个输入数据行合并为一个观测。 应用举例应用举例 例3 由一个输入数据行创建多个观测 data A;input ID $ score1- score3;drop score1- score3;score=s

22、core1; output;score=score2; output;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例4 一个DATA步创建多个数据集 data A B;set ;if Stktype=A then output Astk;else if Stktype=B th

23、en output bstk;run;例中,一个DATA步创建两个数据集。数据集Astk包含变量Stktype=A的所有观测;数据集Bstk包含变量Stktype=B的所有观测。6 6 由几个记录组合信息 proc sort data= out=lstkinfo;by stktype;data a;set lstkinfo ;by stktype;if first. Stktype then Num=0;Num+1;keep stktype num ;if then output;run;例中,计算数据集lstkinfo中两类不同股票的数目。这样的方法是不是简单快捷。这个例子很有用,从这里也认

24、识了自动变量:first. stktype 和last. stktype的使用方法。数据处理时用这个语句会很省力。MISSING语句语句 MISSING语句规定缺失值的符号。读入含有缺失值的数据源时,必须用MISSING语句,否则可能产生读入错误。 语句格式语句格式Missing charcter1charctern; 其中:charcter规定代表缺失值的字符。 应用举例应用举例 例7.29 规定缺失值字符 data period_a;missing X I;input Id $4. Foodpr1 Foodpr2 Foodpr3 Coffeem1 Coffeem2;datalines;10

25、01 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 Foodpr2Foodpr3 Coffeem1Coffeem210011154565 I 781002862755 72 8610049352X 76 881015733543 112 108102710112739 76 79其它语句其它语句

26、本节介绍语句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 -

27、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);选项说明: 例7.32 创建包含DATA信息的宏变量 data a;call symput (text1, march); /*将march赋给宏变量text1 */call symput (beta, 100); /*将100赋给宏变量beta */run

28、;例7.33 发布操作系统命令 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 32 5 8. 3 9;proc print;run;在这个DATA步,C

29、ARDS语句告诉SAS 系统在这个作业流中,紧跟着的是数据行,当SAS遇到空语句(;)时,就知道数据行结束了。上例中的空语句也可以省略,因数据行后面第一个语句(PROC PRINT;)中包含一个分号。输出窗口显示结果Obs y z1 2 52 1 33 5 84 3 9ERROR语句语句 ERROR语句置自动变量_error_为1,并有选择地输出用户规定的一段信息到SAS的记录窗口。语句格式:ERROR ;选项说明: ERROR语句等价于下面一系列语句: 赋值语句置_ERROR_为1; 一个FILE LOG语句; PUT语句规定一段信息; 新的一个FILE语句重新设置前一个FILE 语句的设置

30、。例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 ;316 if type=teen & age 19 then error type and age dont macth age=;317 cards;type and age dont macthage=20

31、RULE: -+-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;input name $ type $ age ;if type=teen & age 19 then do;put type and age dont macth age=;_error_=1;e

32、nd;cards;Wu teen 20Li teen 12Cindy adult 28;run;上面程序与前一页程序结果相同。第一段用ERROR语句,第二段用PUT和_ERROR_语句。另外,可以通过FILE语句改变输出错误信息的地点。 第第15章章 数据管理数据管理清华大学经管学院清华大学经管学院 朱世武朱世武Resdat样本数据:样本数据:SAS论坛:论坛: SAS系统提供的过程按其用途可分为四大类:n 数据管理;n 基础统计;n 数据呈现;n 数据访问。 和任何一种编程语言一样,SAS 系统有一些数据管理过程,用于实现常用的中间操作或数据转换。 本章将介绍的数据管理过程:本章将介绍的数据

33、管理过程: 数据集排序; 数据集转置; 改变输出地点; 添加观测; 数据库复制。数据集排序数据集排序 利用SAS的排序过程可以对数据集中的观测重新排序。SAS许多和BY配合使用的语句,如对数据集进行合并的语句或更新语句等,使用前必须先对BY变量进行排序。 排序过程句法排序过程句法PROC SORT ; BY variable-1 . variable-n; PROC SORT语句语句 PROC SORT ;选项说明: DATA=规定被排序数据集,缺省时为最新创建数据集OUT=创建输出数据集,省略时用排序后数据集替换原数据集ASCII规定按ASCII排序SWEDISH规定按Swedish排序NA

34、TIONAL规定按习惯排序FORCE强行实施多余排序其中:其中:选项选项FORCE强行实施多余排序。排序并替换原来加索引的或取子集的数据集,强行实施多余排序。排序并替换原来加索引的或取子集的数据集,即没有规定即没有规定OUT=选项时,如果没有规定选项时,如果没有规定FORCE,就不能对有索引的数据就不能对有索引的数据集进行排序和替换。集进行排序和替换。 没有规定OUT=选项时必须使用FORCE的选项有:n OBS=系统选项;n FIRSTOBS=系统选项;n DATA=数据集中的数据集选项WHERS=;n PROC SORT 步用WHERE语句。BY语句语句 BY variable-1vari

35、able-n;PROC SORT中必须使用BY语句,BY语句中可以规定任意多个变量。BY语句中规定多个变量时,SORT过程首先按第一个变量排序,然后是第二个变量等。BY语句中可以规定的选项:DESCENDING对变量按下降次序排序。 应用举例应用举例 例15.1 按多变量排序。data a;set ResDat.Idx000001;year=year(date);qtr=qtr(date);month=month(date);proc sort data=a out=b;by year qtr month;run;例中,对上证数据Idx000001按年、季和月排序。 例15.2 按单变量降序排

36、列。 proc sort data= ResDat.a600001 out=a; by descending clpr; proc print data=a (obs=3) noobs; var date clpr; run; 例中,按收盘价CLPR的降序排列。数据集转置数据集转置 转置就是把数据集的观测变为变量,变量变为观测。利用SAS的转置过程可以对数据集进行转置。 转置过程句法转置过程句法 PROC TRANSPOSE ; BY variable-1 . variable-n ; COPY variable(s); ID variable; IDLABEL variable; VAR v

37、ariable(s); 语句说明: PROC TRANSPOSE 语句语句 PROC TRANSPOSE ;选项说明: VAR语句和语句和ID语句语句 VAR语句VAR variable-list;VAR语句列出要转置的变量。没有VAR语句时,则没有列在其它语句里的所有数值变量被转置。ID语句ID variable;ID语句规定输入数据集中一个变量。ID变量的值为转置后数据集的变量名。在没有选项LET时,ID变量的值在数据集中只能出现一次,使用BY语句,BY组内只包含最后的ID值。应用举例应用举例 例15.4 ID变量的值为转置后数据集的变量名。proc transpose data= out

38、=a let;id name;proc print;run;例中,原数据集CLASS中变量NAME的值为转置后数据集A的变量名,对所有数值变量转置。数据集A中还有一变量_NAME_. SAS 系统 1 202X年03月07日 星期五 下午09时21分17秒 Obs _NAME_ Alice Barbara Carol Jane Janet Joyce Judy Louise Mary Alfred 1 Age 13.0 Obs Henry James Jeffrey John Philip Robert Ronald Thomas William BY组内最后一个ID值的观测被转置。proc

39、transpose data= out=a let;id sex;proc print;run;结果显示:proc transpose data= out=a let;id sex;by sex;proc print;run;结果显示:例15.8 对每个BY组转置。options nodate pageno=1 linesize=80 pagesize=40;proc transpose data= out=fishlength(rename=(col1=Measurement);var length1-length4;by location date;run;proc print data=

40、fishlength noobs;title Fish Length Data for Each Location and Date;run; Fish Length Data for Each Location and Date 1 Location Date _NAME_ Measurement Cole Pond 02JUN95 Length1 31 Cole Pond 02JUN95 Length2 32 Cole Pond 02JUN95 Length3 32 Cole Pond 02JUN95 Length4 33 Cole Pond 03JUL95 Length1 33 Cole

41、 Pond 03JUL95 Length2 34 Cole Pond 03JUL95 Length3 37 Cole Pond 03JUL95 Length4 32 Cole Pond 04AUG95 Length1 29 输出窗口显示例例15.10 对转置后的数据集作统计分析。对转置后的数据集作统计分析。options nodate pageno=1 linesize=80 pagesize=40;data split;set ;array s7 s1-s7;subject + 1;do Time=1 to 7;strength=stime;output;end;drop s1-s7;run

42、;proc print data=split(obs=15) noobs;title Split Data Set;title2 First 15 Observations Only;run;/*接左侧*/proc transpose data=split out=totsplit prefix=Str;by program subject;copy time strength; var strength;run;proc print data=totsplit(obs=15) noobs;title Totsplit Data Set;title2 First 15 Observations

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论