ch02SAS语言与数据管理.doc_第1页
ch02SAS语言与数据管理.doc_第2页
ch02SAS语言与数据管理.doc_第3页
ch02SAS语言与数据管理.doc_第4页
ch02SAS语言与数据管理.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

第2章 SAS语言与数据管理教学要求:l 了解SAS语言的基本成分与规则l 掌握SAS语言的编程计算功能l 掌握SAS语言的数据处理功能l 了解SAS宏功能(不作要求)l 会用proc sqr管理数据(不作要求)2.1 SAS语言构成2.1.1 SAS语句定义:SAS语句是构成SAS程序中的数据步和过程步的基本单位,一般由一个关键字(如data、proc、cards等)开头,以分号“;”结束,其中包含SAS名字、特殊字符、运算符等。说明:l SAS关键字是用于SAS语句开头的特殊单词;l 除赋值、累加、注释及空语句外,SAS语句一般都有关键字开头;l SAS名字是用来标识各种SAS成分,如变量、数据集、逻辑库等;l SAS名字由1-32个字母、数字、下划线组成,第一个字符必须是字母或下划线;(逻辑库名最多8个字符)l SAS关键字和名字不区分大小写。2.1.2 SAS表达式定义:数据步中用于计算的是SAS表达式,它是把常量、变量、函数及运算符、括号连接起来的一个式子。说明:l 常量:有数值型、字符型两种,并且可表达日期、时间的数据类型。如12,-7.5,2.5E-10,Beijing,”Li Ming”,13JUL1998d,14:20t。l 变量:有数据值、字符型两种。时间、日期系统自动存为数值型的。数值型变量在数据集中存储一般使用8个字节,字符型变量默认的长度是8个字符。可以使用Length语句改变字符型的长度,格式为:Length 字符型变量名 $ 长度 ;如 Length name $ 10 ;l 运算符:包括算术运算符、比较运算符及逻辑运算符等。l 算术运算符用来执行一个算术运算,常用的有 符号*/*含义加减乘除乘方l 比较运算符用来给出两个量间的关系,常用的有:符号=或eq= 或ne 或gt=或ge =1000) and (salary 2000) 表示工资收入在10002000之间(不含2000)(age 0 then put x为正数;(2)如果需要同时规定条件不满足时执行的操作,可用: If 条件 then 语句1; Else 语句2;例如:if x=0 then x=2*x; Else x=-x;注:以上then 和else后的语句都是单个语句;如果当条件成立时要执行几个语句(即复合语句),则应该把要同时执行的几个语句用DO-END括起来。例如:【例2.3】自己练习程序prg2.3.sas。2Select 分支语句Selct语句可以实现比IF语句更加灵活的多分支结构,它有两种用法:(1) 格式一:select (选择表达式); when (值列表1) 语句1;when (值列表2) 语句2; otherwise 语句n; end;说明:l “选择表达式”是一数值型或字符型的变量或表达式;l “值列表”为一项或若干项,多项之间用逗号“,”隔开,数值类型与选择表达式相同;l “语句”为单个语句或复合语句;l 执行过程:先计算出选择表达式的值,然后由前往后与值列表中的值比较,发现相等则执行对应的语句,然后退出select结构(不再查看后面的值列表)。如果选择表达式的值不等于任何值列表中的值,则执行otherwise 中的语句。【例2.4】练习以下程序prg2.4.sas.(2) 格式二: select; when (条件1) 语句1;when (条件2) 语句2; otherwise 语句n; end;说明:l select语句后没有选择表达式,各个“条件”是一逻辑表达式;l 执行过程:由前往后检查when 后的条件,它只执行第一个满足条件的when后的语句;如果所有条件都不满足,则执行otherwise后的语句。【例2.5】练习以下程序T2.5.sas.2.2.4循环语句1计数Do循环格式:do 计数变量=起始值 to 结束值 by 步长; 循环体语句; end;说明:l 执行过程:先把计数变量赋值为起始值,如果此值小于等于结束值,则执行循环体语句,然后把计数变量加上步长,再判断它是否小于等于结束值,如果是,则继续执行循环体,直到计数变量的值大于结束值为止。l 如果步长为1,则可省略“by 步长”;如果步长为负值,则计数变量小于结束值时停止循环。l 循环体语句可以为多个语句;可以使用leave语句跳出循环;还可使用continue语句立即结束本轮循环并转入下一轮循环的判断与执行。【例2.6】以下程序prg2.6.sas是输出一个1,3,7,19的立方表,且当立方大于1000时停止循环。2. Do-while型循环格式:do while 循环继续条件; 循环体语句; end;说明:l 循环体语句可以为多个语句;l 执行过程:程序先判断“循环继续条件”是否成立,成立时执行“循环体语句”,再判断“循环断续条件”,如此重复,直到“循环断续条件”不再成立。【例2.7】以下程序Prg2.7.sas是判断1333333是不是素数。注1:其中mod(x,i)表示 x 除以 i的余数注2:素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。3. Do-until型循环格式:do until 循环退出条件; 循环体语句; end;说明:l 执行过程:程序先执行循环体,然后判断“循环退出条件”是否成立,成立则结束循环,否则继续。注意每轮循环都是先执行循环体再判断是否退出。【例2.8】输入以下程序prg2.8.sas,看看输出是什么?(可以输出n=1,n=2,n=6)注:程序中的n+1是一种特殊写法,叫做累加语句,等价于n=n+1.。2.2.5数组SAS可以把同为数值型 或同为字符型的变量合在一起组成一个数组,使用一个共同的名字,其中各变量用下标来区分。1.数值型数组定义格式: array 数组名 (维数说明) 数组元素名列表 (初始值表);例如:array test(3) math Chinese English (0,0,0);说明:l 数组名为一个合法的SAS名字且不能与同一数据步中的其它变量重名;l “维数说明”如果只说明元素个数,这时下标从1开始。l “数组元素名列表”列出这个数组的各个元素实际代表的变量名,它们之间用空格隔开; l “初始值表”给数据中各元素赋初值,按顺序对应;如果省略初始值,这时初始值为相应数组元素的值(如果数据元素没有值,则初始值为缺失值)l 如果省略数组元素名列表,此时数组元素的变量名为数组名后附加序号,如 array x(3);l 中数组x的各元素名为x1,x2,x3。l 数组维数也可用“下标上界:下标上界”来说明,如array sales(95:97) yr95-yr97;l 一维数组的维数可用星号“*”,表示数组大小由提供的元素列表中的变量个数决定,如array test(*) math Chinese English (0,0,0);l 定义二维数组,只要在维数说明中指定用逗号分开的两个下标界说明,如Array table(2,2) x11 x12 x21 x22;2.字符型数组定义格式: array 数组名(维数说明)$ 元素长度说明 数组元素名列表 (初始值表);例如:array name(3) $ 10 child father mother;说明:字符型数组与数值型数组的定义时区别是:需加上一个$符号说明为字符型,并说明数组元素所能存储的字符串的最大长度。其它用法与数值型数组相同。3.临时数组临时数组的元素只由数组名和序号决定,没有对应的变量名。定义格式为:array 数组名 (维数说明) _temporary_ (初始值表);如:array x(3) _temporary_ (0,0,0);它说明了一个有3个元素的临时数组x,其元素为x(1),x(2),x(3)。即使变量x1,x2,x3存在,也与此数组无关。特点:它只用于中间计算,最终不被写入数据集。且临时数组与其它变量及非临时数组的不同是:它在数据步隐含循环中不论是否指定初始值都能自动保留上一步得到的值。临时数组也可以为多维,或字符型数组。4.数组的使用数组可将类似的数据存放在一起,这样可以数组元素的形式方便循环处理。【例2.10】以下程序可以读入comp1comp10的10个计算机销售额及prin1prin6的6个打印机销售额变量,计算其总和。【综合应用例2.11】用随机函数模拟24次掷双骰,显示掷出的结果及掷出双六点的次数。解:注:均匀分布随机函数ranun(种子数)产生(0,1)范围内的随机数,参数种子数为小于231-1的任意常数,如果为0或负数则采用系统时间作为种子数。2.3 SAS语言的数据管理功能SAS语言具有很强大的数据操作能力,表现为:可读入任意复杂格式的数据,并可对数据进行计算、子集选择、更新、合并、拆分等操作。此外SAS系统还提供可访问其它数据库的接口(如Oracle、Sybase、Excel、Foxpro 等),以及提供了SQL过程来实现数据库查询语言的功能。2.3.1数据步的运行机制一个SAS数据步相当于一个单独运行的程序,它具有其它语言所没有的功能,首先看如下程序:【例2.12】输出为:(1)文件print为:x=. y=. z=.x=10 y=20 z=30x=. y=. z=.x=100 y=200 z=300x=. y=. z=.(2)work.a数据集为:1 10 20 302 100 200 300结论:(1)SAS数据步如果有数据输入,比如用input、set、merge、update、modify等语句读入数据,则数据步中隐含了一个循环,即数据步程序执行到最后一个语句后,会返回到数据步内的第一个可执行语句开始继续执行,直到读入数据语句(input、set、merge、update、modify等语句)读入了数据结束标志才停止执行数据步,并把读入的各个观测写入到data语句中指定的数据集。如果没有数据输入而只有直接计算,则数据步程序不需要此隐含循环。(注:变量_n_表示的是数据步隐含循环到第几次的特殊变量)。框图如下:数据步开始继续运行遇到input、set、merge、update、modify时读入下一个观测用程序语句对数据进行处理读取非空?用output语句或数据步结束隐含的输出把观测写入输出数据集数据步终止生成输出数据集(2)每步隐含循环开始时所有变量赋为缺失值,不保留上一步隐含循环中的变量值,用retain语句则可以指定某些变量保留上一步隐含循环中的变量值。如在上面程序开始时加入语句:Retain x y (1,2);其中(1,2)表示x,y的初值,则输出结果变成: 文件print为:x=1 y=2 z=.x=10 y=20 z=30x=10 y=20 z=.x=100 y=200 z=300x=100 y=200 z=. work。a数据集为 1 10 20 30 2 100 200 3002.3.2用input语句输入数据功能:用input语句指定输入的变量和格式,可以从原始数据输入数据到新数据集,数据行写在cards语句和一个只有一个顶头的分号“;”的行之间。1.自由格式它是在关键字input后,按顺序列出每个观测的各个变量名,中间用空格分开。变量如果是字符型的,则需要在变量名后加一个“$”符号,“$”可以与变量名相连,也可空一个空格。如下程序【例2.13】自由格式条件:l 数据每行为一个观测,各数据值之间用一个或几个空格分隔;l 无论是字符型还是数值型,缺失数据都必须用小数点表示。l 字符型数据长度不能超过8个字符,不允许完全是空格,中间不允许有空格,开头和结尾如果有空格将被忽略。l Input语句中必须列出每一项数据对应的变量名而不能省略中间或前面的某一个。l 输入数据时不必上下对齐,不需要知道每个变量的具体列数而只知它的次序。2.列格式它是在关键字input后除了列出变量名外,还需要在每个变量名(及“$”符)后列出该变量在数据行中所占据的列起始位置及结束位置。如下程序:【例2.14】2.列格式条件:l 数据行必须上下对齐l 各数据项之间可以没有任何分隔,连续写在一起;l 字符型数据长度可以超过8个字符,中间可以有空格,开头和结尾如果有空格将被忽略。l 无论是字符型还是数值型,如果指定列位置为空白,则输入为缺失数据,用小数点表示。l 可以只输入数据行中的某些项而忽略其它项,【例2.15】输入一批身份证号码,但只输入其年、月、日信息,可用如下程序:注:列格式可与自由格式混用,如1.1.3节中的程序pr1.1.sas(3)有格式输入在关键字input后列出变量名及格式名,通常用来读入各种各样写法的日期。注意日期是用数值存储的,若要显示则要用format语句,指定特殊的日期输出格式。如程序【例2.16】:输出为:Obs date sales1 1956-06-13 11002 1967-12-15 12003 1978-10-02 13004 1989-10-01 14005 1996-01-01 15006 2002-09-01 1600说明:l 其中yymmdd8.规定输入日期占据8列位置,不满8列则用空格补充,不能让后面的数据进行这8列。这样则可输入不带世纪的六位数日期,也可输入带世纪的8位yyyymmdd格式的日期值。l 用yymmdd10.则可输入带世纪数的中间有分隔符或无分隔的日期(如程序prg2.17)l 如果日期变量输入值不在第一项,并且与前一项用空白分隔,则可在yymmdd10.前面加上一个冒号“:”,表示允许日期值前面有空白,如程序prg2.182.3.3用attrib语句指定变量属性1.变量属性有:l 字符型或数值型:input语句中字符型变量名后面要加$符号l 变量标签(lable):最长40个字符l 存储长度(length):数值型数据一般长度为8个字,字符型变量默认为8个字符l 输出格式(format):指定如何显示变量值l 输入格式(informat):指定如何把外部数据转换为SAS数据2.attrib语句功能:可以指定多个变量的属性,也可为一个变量同时指定多个属性格式: attrib 变量名 属性=属性值 变量名 属性=属性值;例如下程序【例2.19】:输出数据集为: 姓名 日期 金额张鹏 1998-10-15 2000.00李志明 1999-01-03 1500.00王敏 1999-11-05 3000.002.3.4读入外部数据1.文本格式的数据文件(infile语句)功能:如果数据量很大时,用cards语句将数据放在程序中不利用于程序的维护,此时可将原始数据放在一个普通的文本格式的文件中,然后用infile语句指定输入文件名。格式: infile 文件名;【例2.20】1.1.3节中的程序prg1.1中的数据事先生成数据文件stud.txt,并存放在路径d:mysasfile下,则可用如下程序读入数据:说明:infile语句要写在input语句前;有了infile就不用cards语句了,infile关键字后面的文件名可以为全路径名,如果只有文件名则为当前工作目录。2微机格式的数据文件(import过程)功能:SAS的导入向导(import wizard)可将其他格式的数据文件(如excel 、Acess、Dbase、Lotus等格式)转换为SAS数据集,并可将操作过程保存为import过程的程序。【例2.21】将d:mysasfilec9501.sas导入SAS,生成数据集work.c95012操作过程P63页:File(文件)import data(数据导入),注意过高版本要另存为低版本。.2.3.5数据集的复制与修改(set语句)功能:实现数据集的复制,与其它语句配合使用可以实现对数据集的修改1.与if语句配合使用【例2.22】:将数据集work.c9501复制为数据集c9501a,并把超过100分的语文成绩都改为100分,如程序:说明:(1)程序中有一个隐含循环,set语句是读取观测的语句,程序中数据步内反复循环,直到读取输入数据集的最后一个观测。2.与keep或drop语句配合使用功能:keep语句指定复制数据集时要保留的变量,drop语句指定复制数据集时要删除的变量,【例2.23】:复制数据集c9501生成c9501b,但只包含name和avg两个变量,可用如下程序:3.与子集if语句配合使用功能:根据指定的条件,取出数据集的某些行组成的子集【例2.24】:只将数据集c9501中数学90分以上,语文100分以上的学生观测取出生成数据集c9501c,可用如下程序:注:其中子集if语句是没有then 部分的,只有要满足的条件。但它等效于if math=90 and chinese =100 then output;4.与数据集选项配合功能:用set语句引入数据集时可以给引入的数据集加选项,选项放在数据集名后面的括号内。选择包括:Keep=,指定要保留的变量;Drop=,指定要删除的变量;Obs=,表示读取观测到指定的序号为止,firobs=,表示从指定的序号的观测开始往后读取。【例2.25】:下面的程序生成一个大数据集huge,然后用数据步从中复制了前100行和前两个变量:2.3.6拆分数据集用set语句与output语句联合使用,可以根据某一原则将一个数据集拆分成几个不同的数据集。【例2.26】:把数据集c9501中的所有男生的观测放到数据集c9501m中,所有女生的观测放到数据集c9501f中,可用如下程序:说明:l output语句是使SAS系统输出当前的观测或变量值写到正被创建的数据集中。l 数据步中有了output语句数据步流程中不再等到最后一个可执行语句结束后,自动写入观测到新数据集的操作,而只能由output语句指定输出。l Output后没有数据集名,则输出到所有data关键字后新建的数据集。【例2.27】如下程序生成一个包含110及其平方的10个观测的数据集:2.3.7纵向合并数据集(set语句)功能:l 有时需要将几个数据集上下纵向合并起来,生成一个大数据集,可以在set语句后列出要合并的数据集名。如果要合并的数据集中含有的变量名都相同,则新数据集不产生新变量;如果不同数据集含有不同的变量名表,则新数据集包含所有数据集中所有不重复变量,其中原数据集没有的变量将赋予缺失值。【例2.28】建立score1 和score2数据集,并合并成score数据集,程序如下:输出为: Obs name sex math physics english chinese1 chen f 80 85 90 652 Li m 75 89 60 75

温馨提示

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

评论

0/150

提交评论