版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、SAS语言抛砖引玉(Beta版) 发表日期:2008年4月12日 作者:锻剑行 【编辑录入:aegean】 SAS语言抛砖引玉(Beta版)锻剑行前 言第一章 关于SAS第二章 语言基础第三章 SAS视窗操作第四章 输入数据 第一节 读取原始数据 第二节 输入格式 第三节 导入数据 第四节 其他输入数据方式第五章 整理数据 第一节、数据集选项
2、160; 第二节、在数据步中整理数据集 第三节、过程步的整理 第四节、缺失值的处理第六章 输出结果 第一节 输出方式 第二节 print过程 第三节 put输入与输出格式 第四节 export过程第七章 调试程序 第一节 错误分类 第二节 如何调试程序附录1 SAS系统管理与环境设置附录2 SAS常用语句一览附录3 SAS常用函数一览SAS语言抛砖引玉(Beta版)锻剑行不要
3、把学SAS当作一件很时髦的事情,能用简单软件完成的事情就没有必要动用SAS;如果你的领域是统计,那应该考虑一开始就学习SAS。前 言 纵观市面上的SAS书籍,发现SAS教程也不少,但是大多都是统计应用的书籍,而讲解SAS语言基础的书籍却很难见到。作为一门语言,语法教程的缺位是不应该的。较之于其他语言的语法教程比比皆是,这也确实是一种奇怪的现象。目前大多的SAS数据也并不是没有讲到基础内容,而是都草草的介绍了一些语言基础就开始把读者带入统计过程,本来有些初学者心态就很急,而作者这么快的就 将读者带入应用领域,更加没有人去学好语言基础了。更有甚者,某些作者在书中写了一些所谓的标准程序,然
4、后告诉读者只要按照标准程序去套用就行了,还声称这是学习SAS最快捷的方法。因此,作者决定写一本语言基础的教程,详细的讲解SAS语法。非常非常高兴我的第一本SAS教程经历一个多月终于出炉了,将其命名为SAS语言抛砖引玉。该教程讲解SAS最最基础的知识,之所以说是基础,是因为 它跟已有的教程有一个最大的区别只有SAS语言,没有任何统计过程。没有任何统计过程的好处是读者能够静下心来跟随作者一起去研究SAS语言,弄懂 它,吃透它;而不是刚会走就想着跑甚至想飞,还没学几条语句就想去做统计分析,到头来发现错误百出而又手足无措。 面向对象任何想学习和了解SAS语言的人。 此教程可以学到
5、什么?导读第一章是介绍什么是SAS。第二章是语言基础主要是各语法元素:数据类型、表达式(变量、常量、算符)、语句、数组、控制流、函数等,还介绍了SAS特别的程序结构和特有的数据集知识。如果有其他语言的基础学习这一章会很容易理解,多多比较SAS语言跟其他语言的区别对两门语言都有裨益。第三章是SAS的视窗操作只是略加提及,没有细致讨论。第四章是如何输入数据? 输入输出本就是一门语言最基本的要素,但SAS有些特殊,它的输入方式多种多样而且稍显复杂但功能强大,因为作为统计分析软件,输入数据还肩负着如何正确识别的问题。第五章是如何整理数据? 将输入的数据整理成我们想要的形式,以便更好的呈现和进行后期分析
6、。第六章是如何输出数据? 输出数据跟输入数据是相反的过程但有着相同的机制,对第四章足够熟练的掌握基础上,学习这一章不费吹灰之力。第七章是如何调试程序? 了解通常会出现哪些错误对避免措施是很有好处的,LOG窗口的信息往往是提供了查找语法错误的重要信息,而使用data步调试器则可以让程序员很方便的发现逻辑错误。 此教程不可以学到什么?本教程没有讲到任何统计分析的过程,期望从这里学到如何直接进行诸如t检验,方差分析,卡方检验的人可以到这里止步了。本教程不是语法参考书,只包含常用的语法,最为准确、权威和全面的语法说明还是SAS软件自己的帮助文档。要说它是哪个SAS模块中的内容,这只能算是Ba
7、se SAS中很少的一部分知识。 如何更好的学习本教程?本教程不一定要完全按照顺序来读,有些前面比较基础的内容举例中往往用到后面章节的语句或语法,如果有些不懂,可以先跳过,看过整个教程后再回头再慢慢琢磨。多多结合实例进行学习,这样才会将语法理解透彻。本教程出现的例程都经作者测试过,即使从帮助文档上面弄来的也不例外。如果还有什么问题,可以直接跟作者()交流,也欢迎有人对本教程进行批评指正。好了,最后希望本教程让你的SAS语言知识能够得到一点点增长,被你忽略的SAS编程的细节能够重新引起你的重视,似懂非懂的一些问题能够明了清晰。第一章关于SAS1.SAS是什么?What is SAS?S
8、AS is a set of solutions for enterprise-wide business users as well as a powerful fourth-generation programming language and an integrated system of software products for performing这是官方的解释。我们可以看出SAS公司对SAS系统的定位:能提供企业级商业应用的一整套解决方案;功能强大的第四代程序语言;综合性的产品库。可以看出,SAS已经不仅仅是一个统计分析软件,而是一个功能强大的软件系统。它的强大体现在它庞大的产品
9、库上,它的触角几乎已经伸到数据处理的每一个领 域。尽管如此,SAS软件还是以它的统计功能驰名,这也是它整个系统的基石,所以通常提起SAS,会认为它是统计分析软件。这里我不解释SAS的全称是什么,但是希望每一个学SAS的人应该知道。 2.SAS模块产品库前面提到SAS是一个综合产品库,是因为SAS是一个组合软件系统,SAS System是由一个一个的模块(或称为产品)组合到一起,可以单独购买和使用某一个模块或几个模块。当然,其中Base SAS是核心,除了提供数据管理和一部分统计分析功能外,它是作为其他模块的基础而必须存在。至于SAS具体包含那些产品/模块,可以参看有关书籍对SAS的介
10、绍或帮助文档。之所以介绍SAS的产品库,是想让大家知道,SAS是一个庞大的系统,我们现在学的只是它一个模块Base SAS中很少一部分内容,不要因为会几个统计过程就以为“精通”SAS,即使高手也要在精通后面限定某个模块。 3.SAS的安装·配置要求如何?首先说一下配置要求,硬件方面只要不装在老爷机上就行了,一般近几年的机器都不存在问题,至于详细的硬件配置要求,有兴趣的可以查看帮助文件或者SAS官方网站()。软件环境方面,本教程就只考虑在Windows系统下的使用。·SAS软件如何获得?至于SAS软件怎么获得,这个就要靠自己想办法了,上网搜搜或者去论坛逛逛很容易找到
11、。如果是单位/企业用户,那还是建议购买SAS正版软件,要不然可能面临侵权的诉讼,而且做出来的统计分析报告可能不能在国际上发表等等问题。·SAS软件版本问题?很多刚学SAS的人在获得SAS软件时总关心一个问题,应该用哪一个版本,而且很多人在动手学SAS之前花很大力气在很多论坛或QQ群里面辛苦的找SAS 最新版本下载,其实SAS的版本对于大多数用户来说没有那么重要,特别是应用仅仅是统计分析的情况下。前面我们讲了,SAS是一套系统,它发展到今天已经 不仅仅是统计软件了,还包括很多模块,而且它的统计分析模块已经发展的很成熟。版本的更新无非就是一些功能模块的扩展、程序算法的优化、界面的改进等等
12、, 甚至某些更新就是为了适应64bitcpu或者OS的出现,这些更新对统计分析等发展很成熟的模块影响不是很大。所以个人觉得没有必要非得用最新的版本不 可,手头上哪个版本最容易获得就可以开始学了。国内用户常用的版本有6.12版、8.2版和9.0/9.1.3版,本教程是基于9.0版的,某个别地方有 版本差别我会在文中给出说明。·SAS软件的安装安装SAS跟安装其他Windows软件没有什么区别,除非你的软件是D版的就有点复杂,具体过程请参考网上教程。 4.SAS帮助文档的结构不管什么软件,它的帮助文档是很重要的。学习SAS仅仅看帮助文档是不现实的,但是不看文档的人是学不好SAS
13、的,特别是想准确、全面的学习SAS的某一方面的知识时,通过SAS书籍往往是不够的。因此很有必要在这里突出帮助文档的重要性。打开SAS帮助,就会看到帮助文档左边框架显示如下的结构+What's New for SAS 9+Learning to Use SAS+Using SAS Software in Your Operating+SAS Products+SAS User Support ServicesWhat's New for SAS 9告诉你SAS新版本更新的地方,非常详细的分模块介绍新特性。如果用户是从SAS低版本迁移过来的想知道新版本有什么不同,或者非常关心SAS
14、软件的发展情况,或者是特殊用户软件的版本差异对你影响很大,就可以从这里找到答案。Learning to Use SAS告诉你如何学习使用SAS。可以通过以下一些途径学习SAS:+Accessing the Help System? 帮助文档+Sample SAS Programs? SAS实例程序+SAS Online Tutor? 在线手册+Tutorial: Getting Started with SAS Software? 使用指南其中帮助文档提供了最为准确、权威和全面的信息,也就是本章为什么要介绍帮助文档的结构的原因。但是对于中文用户最大的不便就是帮助文档是英文版的,所以,如果不懂英
15、文或特讨厌英文,那帮助文档就一文不值了。其实这些英文只要稍微有点SAS的知识是很容易看懂的。例程库提供了很丰富的程序代码,而且按模块分类组织在一起,这样很方便学习。通过例程的学习可以很好的理解SAS语法,而且通过阅读例程有利于养成良好的编程习惯。SAS网站上的支持服务中心()也是可以获得资源的好地方,不便的同样也是英文。里面有SAS每一个模块pdf版本的详细资料,内容类似于帮助文件;有大量丰富的SAS例程;有SAS用户总结的文章等等。Using SAS Software in Your Operating这里介绍了如何在特定的操作系统环境下更好的使用SAS,如Windows下的视窗操作,如何调
16、用其他应用程序以及使用DDE等;某些跟机器环境有关的特性在这里查询。SAS Products这里是SAS帮助文档的核心,每一个模块的概念、操作、使用以及应用都在这里查询,这里也是使用率最高的一部分,通常使用文档就是查看这里的内容。本书的语法参考就来源于SAS Products-Base SAS,以及部分例程也来源于此。Base SAS分为几大部分。-What's New in Base SAS 9? Base SAS 9的新特性-About Base SAS Software? Base SAS概述+Using Base SAS Software? 如何使用Base SAS模块+SAS
17、 Procedures? Base SAS的过程参考+SAS Language Concepts? SAS语言概念+SAS Language Elements? SAS语言元素+Moving and Accessing Files? 移动和访问文件+Output Delivery System(ODS)? 输出传送系统+SQL Query Window? SQL查询窗口+SAS Macro Reference? SAS宏参考SAS语言概念讲述的更多是语言元素的概念,例如什么是变量、函数、表达式、语句、数据集、过程、输入输出格式等等。如果想对这些概念比较清楚的掌握而且弄清楚SAS语言的结构和机制
18、,可以详细的阅读这一部分。SAS语言元素更多的是具体的元素,例如所有的数据集选项、所有的语句、所有的函数等等都可以在这里找到用法参考。因此如果是想知道某一具体的语句、函数等的用法可以阅读这一部分内容。SAS User Support Services常规性的信息,如如何获得技术支持,培训,如何购买软件,如何加入SAS讨论组等等。第二章语言基础(程序结构、数据类型、表达式与语句)如果你曾经学过一门语言的话,就应该知道语言基础这里会讲些什么内容了。其实各种语言的语法套路是差不多的,无非就是数据类型、变量、常量、运算符、流程结构、函数以及输入输出等。1.第一个SAS程序(SAS program)ti
19、tle "My first SAS program"data temp; input group $ x ; cards;A 54.0 B 50.2 A 56.6 B 53.8 A 57.3 A 51.2;proc ttest data=temp; var x; class group;run;这个程序是用t检验来检验6-7岁的城市儿童与农村儿童的胸围是否不同。SAS程序中,每一行以分号(;)结尾的称为语句,语句是SAS程序最基本的单位,这跟其他语言是一致的。SAS程序的
20、层次是非常清楚的,因为它是模块化的。每一个SAS程序是有若干个语句组成,看起来可能非常复杂松散,而实际上SAS程序是两个模块化的结构 构成即数据步和过程步,以及一些设置环境变量的全程语句。上面程序中,第一个语句是标题语句,也即是全程语句。data语句到第7行单独的分号被称为数据 步,proc语句到run;语句被称为过程步。而且有些语句是专用于数据步的,比如input语句和cards语句;而有些语句是专用于过程步,如var 语句和class语句;还有些语句是可以单独放在任何位置,称为全程语句。 1.1 程序结构:数据步(Data step):用来创建和修改用于统计分析的数据集,实现基础
21、的编程功能;每个data步以data语句开始,可以包含任意多个SAS程序语句。过程步(Proc step):利用已创建的数据集完成特定的统计分析任务、结果输出及部分数据集整理功能。proc步以proc语句开始,数据集作为输入;其他语句给出用户想得到有关结果的更多信息的程序语句,这些语句依赖于用户调用的具体的过程。数据步只要求以data步开始,没有其他限制;而proc步则更像一个模板,每一个过程有确定可用的语句,用户根据需要往上面填写。所以,说到SAS编 程,大多的技巧和艺术都集中在数据步,过程步几乎没有任何的技巧可言,过程步应用的好坏一方面取决于你前面数据处理的好坏,另一方面取决于用户的统计基
22、 础。 1.2 数据步的自循环(Data step's Built-in Loop):个人觉得,如果要学习SAS,最首先要掌握的就是SAS程序的结构及运行机制,而其中最关键的又是data步的自循环,如果不能够理解这一点,那后面的内容就如空中楼阁,是不稳固的。首先,数据步程序是一行一行的执行,这就意味着变量在使用之前必须创建。这一点很容易理解,几乎所有的语言都是如此。其次,数据步程序是一个观测一个观测读取。当程序正确的执行到数据步的最后一个语句时,就将该次读取的一条观测写入数据集,然后又重新开始执行数据步,继续读取观测值,这就是数据步的自循环。也就是相当于数据步的最后隐含包括了
23、两个语句,output与return语句。第一个问题是读取的数据在执行到最后写入数据集之前保存在哪里?input语句执行后,SAS将读取的数据暂时先保存在内存缓冲区,然后执行后面的语句, 后面的语句可以对暂存在内存缓冲区中的变量值进行修改,到最后才将整条数据写入数据集,写入数据集的数据就不能在当前data步中再修改。第二个问题,在data步中间使用return语句会怎么样?自然是按照用户的意思进行执行,当遇到return语句时就重新执行数据步,读取下一条观测值,而跳过return后面的语句。第三个问题,在data步中间使用output语句呢?那么程序会在执行到output语句那里就把放在内存缓
24、冲区里面的观测值写入数据集,而不是等到整个data步执行完了再写入。弄清楚这三个问题了应该弄明白data步的自循环是怎么回事了。而且会发现原来data步不一定是一次只可以读取一条观测,完全可以两条或者更多条一次的读取,比如重复input语句,并且在每条语句之后加一条output语句,就可以实现了。 2.数据类型(Data type):我们在学其他编程语言的时候可能学到很多数据类型,但是SAS将各种各样的数据简化为两种类型,即数值型(numeric)和字符型 (character)。那么这里就有问题了,像C语言那样丰富的数据类型而且实际上也存在各种类型的数据,SAS是如何处理的呢?这里
25、就是SAS的特别 之处了,两种基本的数据类型外加丰富的数据格式就能识别和显示各种各样的数据了,但是前提是你要告诉SAS怎么去识别和显示数据,按照什么格式去识别和显 示数据,这里就涉及到SAS里面一个比较复杂的问题,数据格式,输入数据需要指明输入格式(informat),输出数据需要指明输出格式 (format),这个内容请参看后面的有关章节,这里先了解一下。另外一个问题,从数据类型角度我们把语言分为强类型的和弱类型,强类型的比方说C语言,在使用变量之前得先定义变量,而且必须指定一种数据类型。而SAS 则是弱类型的,也就是在用使用变量之前是不需要定义的,变量的类型取决于数据的类型或者预先定义的格
26、式。这个在后面的程序中可以更多的感受到。 3.变量(variable)变量的命名规范跟其他语言基本相同,要以字母或下划线开始,不要使用系统保留的名称等;需要指明的是SAS的变量名是大小写不敏感的,最多32个字符,不 像SPSS一样,SAS并不支持中文变量名,但是可以用变量标签(label)对变量进行说明,变量标签支持中文,最多256个字符。下面主要讲解SAS比较特殊的内容。3.1 变量的类型(type)前面讲了SAS的数据类型只有两种,数值型和字符型,那么相应的变量类型也是两种,数值型变量和字符型变量。那么如何用这两种类型的变量去存储各种类型的数据?前面一节提到SAS通过丰富的格式数
27、据格式来识别和显示各种形式的数据,那么识别之后怎么存储呢?SAS有一套规则来将所有的数据转换成数值型或者字符型来存储,时间日期,货币数据都不例外。详细内容请参看后面有关章节。? 3.2 变量的类型转换(Type Conversions)对于变量类型之间(字符型与数值型)的转换,SAS有一套规则如下,·如果字符变量与数值运算符在一起使用,则SAS将字符变量转换为数值;·如果字符变量与数值变量进行比较符运算,则SAS将字符变量转换为数值;·如果数值变量与字符运算符在一起使用,则SAS将数值变量转换为字符;·如果在一个赋值语句中,左边跟右边的类型不一
28、,则将右边的类型转换成左边的类型;以上这些转换规则是SAS自动完成的,并且在LOG窗口中打印一个警告信息,指示这个转换发生的地方。以上这些情况在编程的时候最好是不要出现,因为虽然 是自动完成,但是转换的结果不一定是我们预期的,比方说字符变量转换成数值时产生的是一个无效的数值,结果就造成了缺失值,当然SAS会在LOG窗口中提 示出错信息,同时置自动变量_ERROR_的值为1。 3.3 如何创建变量?(Create Variables)SAS是弱类型的语言,使用变量前不需要定义,可以在数据步中直接使用变量,当然更多的情形是在用input语句读取数据时。如果是要预先定义变量的格式,则用fo
29、rmat语句、informat语句、length语句或attrib语句都可以创建变量。 3.4 变量的属性(attribution)通常说起变量,就是指变量的名称。其实变量名只是变量的属性之一。打开一个数据集,然后选定任意一列,点击右键查看属性就会发现第一个选项卡是general,这个对话框里面的内容即为变量的属性,包括变量名、类型、标签、长度及其输入输出格式。变量名用来标识变量,区分不同的变量;类型是指变量是字符型还是数值型;标签用来补充变量的信息,特别是SAS变量不支持中文命名的情况下可以将中文说明 写在变量标签里;长度是变量所有容纳的最多字符的字节数或最大数值的字节数,在没有指
30、定的情况下通常由input语句读取第一个观测值确定下来,当然可以 用语句事先指定;输入输出格式用来输入输出数据,让SAS能对内部与外部的数据能实现转换, 3.5 变量列表(variable list)在一个数据集中,变量按照第一次的出现的顺序(也就是在数据集中的顺序)被SAS系统存储为一个系列,这个系列就是一个完整的变量列表。而实际上我们在操作变量的时候只需要选取其中部分变量,而有了这个完整的变量列表就可以在许多语句中使用缩写的变量列表了。在SAS中,可以使用4种缩写的变量形式:(1)数字系列如果有一系列变量是这样定义的,相同的名字后面加上一个连续的数字,就可以采用数字系列的缩写,如
31、x1, x2, x3, , xn可以缩写为x1-xn(2)变量名系列变量名系列就依赖于变量在SAS数据集中出现的顺序,如x-a 就表示从x变量开始一直到a变量结束这一系列变量,结合自动变量就可以更加灵活的使用变量列表,如x-numeric-a 表示从x变量开始到a变量结束之间的所有数值型变量,x-character-a 表示从从x变量开始到a变量结束之间的所有字符型变量,(3)前缀名系列如果有一系列变量具有相同的前缀名,比方说SALES_JAN, SALES_FEB, SALES_MAR 则可以使用下面的形式表示这一系列变量名,sales:打印这些变量,则proc print; &
32、#160; var sales:;run;对这些变量求和,则sum (of sales:)(4)特殊的变量列表包括三个自动变量代表的变量列表_ALL_全部变量_CHARACTER_ 全部字符型变量_NUMERIC_ 全部数值型变量3.6 自动变量(automatic variable)自动变量是在程序中被SAS自动创建的变量,这些变量名有着特殊的用途,下面介绍一下在data步中的两个自动变量,过程步中的自动变量在具体的过程中讲解。_N_N_在data步开始执行前被初始化为1,然后data步自循环一次该变量增加1,也就是_N_代表data步循环执行的次数。这个变量存在于每一个数据集中,但是一般不
33、会显示也不会被打印。_ERROR_ERROR_在data步执行前被初始化为0,当data步执行过程中遇到错误时就会自动被置为1,而且会在LOG窗口中打印出来,这样有利于调试程序的时候定位错误出现的位置以及出现错误时采取相应的处理。Tips:这里还是说一下SAS的变量命名规则:·首字符要以字母或者下划线开始;·名称中只能包含字母、数字和下划线;·变量名可以是大写,可以是小写,也可以是混合写的,但是SAS会当作是同一个变量名,也就是大小写不敏感;·不要与系统保留的字段同名,比方_N_;·变量名长度,SAS9.0是32位,6.12版和8.2版是8位;
34、说明:其实这些规则同样适用于命名数组、逻辑库、数据集、宏变量、宏名、函数等等,不同的地方是长度限制可能不一样,具体可以查看帮助文件。 4.常量(constant):常量与变量是一个相对的概念。变量是用来存储数值的,而且是可以重新赋值的,而常量是用来表示固定的值,是不可改变的。常量可以是是一个数字、字符串或者其他特殊记号。常量和变量还有运算符一起是构成表达式的元素。常量的类型,SAS使用四种类型常数,另外,十六进制常量单独列出来讲。4.1 字符常数(character)字符常数是用引号(单引号/双引号)引起来的1-32767个字符组成的字符串,如,'Tom', &quo
35、t;Tom"等如果是字符串中包含引号,该怎么办?两种方法方法一:如果包含单引号,怎么用双引号引起来,相反,则用单引号引起来,如,"Tom's" 表示Tom's'Tom"s' 表示Tom''s方法二:对包含在字符串中的引号可以写成连续的两个引号,如,'Tom''s' 表示Tom's"Tom""s"表示Tom''s 4.2 数值常数(numeric)数值常数就是指在SAS语句中的数字,可以包含数字、小数点、
36、符号和特殊记号E,如,1, -5, +49, 1.23, 01, 1.2E23, 0.5E-10等等注意:若一个数值常数大于10E32-1,则必须表示成科学计数法。 4.3 日期、时间和日期时间数值常数(data, time, and datetime)为了将日期、时间或日期时间值表示成常数,使用在输入格式和输出格式中被使用的相同的记法,TIME., DATA.和DATATIME.。格式值用单/双引号引起来,并跟随一个表示格式的字母D(日期)、T(时间)或DT(日期时间)。如,'1jan2006'd;'9:25't;'9:25:19pm'
37、;t;'18jan2002:9:27:05am'dt; 4.4 十六进制常量(hexadecimal)十六进制字符常量:是用引号引起来的一串偶数个的十六进制字符,并跟随一个X,如,'534153'x而且可以在这一串十六进制字符中使用逗号分隔使得易读但不影响十六进制常数的值,只是这里的逗号必须按偶数个来分隔。如上面的常数可以写为,'53,41,53'x十六进制数值常量:通常,十六进制数值常数用一个数字开始(一般是0),紧跟着很多十六进制位,并用字母x结尾。这个常数可以包括最多16个有效的十六进制位,如,0c1x, 9x 5.运算
38、符(operators)在SAS中,算符包括运算符、括号和函数。其中运算符可以分为两种,前缀运算符和中缀运算符,中缀运算符包括算术、比较、逻辑、特殊运算符。5.1 前缀运算符(prefix operator)前缀运算符可以用于变量、常数、函数以及括号括起来的表达式,包括正号(+)、负号(-)及非运算(NOT)。如,+y-25-cos(angle1)+(x*y) 5.2 中缀运算符(infix operator)·算术运算符:+, -, *, /, *, 加减乘除在各种语言里面都是一样,只是乘方可能有些差别,SAS是使用*;·比较运算符:= (EQ), =(NE),
39、 >(GT), <(LT), >=(GE), <=(LE), IN()前面这些运算符分别代表等于、不等于、大于、小于、不小于、不大于,等于列表中一个。其实平常用的话只要知道用符号就行,括号里面的字母是跟符号等价的,了解一下的好处是可以看懂别人的代码,不至于以为是变量名或者英文单词。在SAS语法中,比较运算符是可以连用的,例如if (90=<x<=100) then grade='A'·逻辑运算符:&(AND), |(OR), (NOT), 分别代表与或非,括号里面单词跟符号等价。·其他特殊运算符:<>,
40、 ><, |<>(max)取最大值,例如:a=8.2;b=9.0;min=(a<>b);则min变量等于9.0。><(min)取最小值。|(连接):用来连接字符串,例如:a="Hello, "b='SAS'c='System!'new=a|b|c;则new变量等于'Hello, SAS System!' 5.3 运算次序,跟其他语言大同小异,更详细准确的说明请参看帮助文档。思考题1:比较运算符为什么要选用那些字母呢? 6.表达式(expression)表达式是
41、由一系列算符和运算对象形成的一个指令集,它被执行后产生一个目标值。运算对象包括变量和常数;算符包括运算符、函数和括号。变量和常量是程序处理的两种基本数据对象,算符指定将要进行的操作,表达式则是用算符将变量或常量组合起来生成新的值。 7.语句(statement)一个SAS语句是由SAS关键字、SAS名字、特殊字符和运算符组成的字符串,并以分号(semicolon)结尾,它要求SAS系统执行一种操作或给 SAS系统提供信息。下面举例说明什么是关键字,名字,特殊字符和运算符等,真要解释概念可能到头来我也讲不清楚,你也听不明白。put x $15.;data temp;proc means
42、 data=hospital.patiant maxdec=3;in;do i=1 to dim(eachitem);key1:total+1;*这是注释语句;上面这些语句中,x, total是变量名字;temp和hospital.patiant是SAS数据集名字,其中hospital是库标记;$15.是格式名字;means 是过程名字;data=和maxdec=是means语句中的选项;rawdata是一个文件标记;最后一个语句是注释语句。可以从这些例子中看出,语句 都是以分号结尾的,注释语句也是如此。?语句分类:在SAS中语句分为两大类,data步语句和全程语句。其中data步语句又分为五
43、类:文件操作语句、运行语句、控制语句、信息语句、窗口语句。·文件操作语句:用于操作文件,这些文件用于输入数据集;或者用于输出。·运行语句(动作语句):用于创建、修改或删除变量;或者用来操作记录;或者用来错误信息。·控制语句:实现流程控制的语句。·信息语句:给出关于数据集的附加信息,包括数据集中变量的信息。·窗口语句:用于显示输出或者接受输入。大部分的语句将在本教程中相应位置讲到,想快速获得其用法请参看附录2SAS常用语句一览。第二章语言基础(数组与流程结构)8.数组(array)数组是用来临时存放一系列变量的语法结构,常用于需要对一些变量做相同
44、处理的情况。注意:SAS的数组跟标准语言的数组是不一样,这一点首先要弄明白。在SAS中,数组不是数据结构,它存储的不是数据,而是变量,因此数组元素即是变量, 也就是凡是可用表达式的地方,均可使用数组元素;数组只在当前data步中有效,也就是数组名只能在当前data步中标识数组,不同的data步中可以使 用相同的数组名但不表示同一个数组;默认情况下,数组的标号是从1开始的。8.1 数组的定义(definition)ARRAY array-name subscript <$><length> <array-elements> <(initial-value
45、-list)>说明:·数组名的命名规范与变量命名完全相同,不赘述;但是数组名不能与当前data步中变量同名;·元素个数有三种形式,分别对应于创建数组的三种方法;元素个数必须用大括号()、中括号()或圆括号()括起来,三者等价;·变量列表必须由相同类型的变量组成,要么全是数值型,要么全是字符型;数组列表同样可以是缩写形式;定义数组最简单的方法是直接写明元素的个数,如,array books3 Reference Usage Introduction;也可以用上下界来定义元素个数的范围,如array books0:2 Reference Usage Introd
46、uction;这样的好处是可以自定义数组第一个元素的标号,上面的例子就是从0开始的,自定义标号某些时候会带来好处,如array first10 Year76-Year85;array second76:85 Year76-Year85;数组second显然更方便,不容易引起混淆。定义数组还可以让系统来计算元素的个数,如array score* score1 score2 score3 score4 score5;或array score* score1-5;这种定义的方式更多的用于不知道变量个数的情况下,变量的个数就交给SAS去计算把,如,array x* _NUMERIC_;如果是数组定义一
47、系列字符变量,还可以通过length指定字符变量的长度,如array ch* $ 20 name1-3;思考题2:那么如果要循环引用这个数组呢,是不是用户还得要知道这个数组有多少个元素? 8.2 初始化数组(initial-value)初始化数组时间上是给数组元素即变量赋值,ARRAY array-name number-of-elements <list-of-variables>(initial-value-1<,initial-value-n>);如,array test(3) t1 t2 t3(90 80 70);array ab(5) (5 4 3)
48、;如果初始值比数组元素少,则初始值依次赋值给变量,多余的变量被处理为缺失值,而且SAS会在LOG窗口中给与WARNING提示。给数组元素赋值可以采用缩写的形式,如下面5种初始化数组的方法是等价的,ARRAY x10 x1-x10 (10*5);ARRAY x10 x1-x10 (5*(5 5);ARRAY x10 x1-x10 (5 5 3*(5 5) 5 5);ARRAY x10 x1-x10 (2*(5 5) 5 5 2*(5 5);ARRAY x10 x1-x10 (2*(5 2*(5 5); 8.3 引用数组元素(Array Reference)语法:array-name s
49、ubscript;不同的引用方式在于数组下标的引用不一样。·变量作为下标,主要用于循环语句中variable-1< , . . . variable-n>如,array days7 d1-d7;do i=1 to 7;if daysi=99 then daysi=100;end;·*号作为下标*如,array days7 d1-d7;input days *;·表达式作为下标expression-1< , . . . expression-n>如,array arr1* a1-a3;x=1;input a1 a2 arr1x+2;·
50、;直接使用数组名见do over array-name循环结构 8.4 多维数组(multidimensional array)定义多维数组跟一维数组没有大多区别,只是不同的维度之间用逗号隔开,同一维度同样可以采用元素个数或上下界的书写方式,但不能用*书写方式,如array x5,3 score1-score15;array test3:4,3:7 test1-test10;多维数组中,数值元素(即变量)先行后列依次进行填充。引用及初始化数组都跟一维数组一致。 8.5 临时数组(_temporary_)当用户定义一个数组的目的只是进行计算时,经常用临时数组元素列表,使用临时
51、数组元素可以少的占用内存,加快执行速度。举例,array test4 _TEMPORARY_ (90 80 70 70);另外,临时数组还有如下一些特点:·数组元素没有名字,引用时必须用数组名和下表,如test1;·不能出现在输出的数据集上;·不能用特殊下标(*)来引用所有元素;·临时数组元素的值总是自动被保存,而不是像普通数组元素在data步的下一次自循环开始时被置为缺失值。 8.6 与数组有关的函数·DIMn(array-name):计算数组第n维的元素个数,第一维时写为DIM,例如:do i=1 to dim(days);do
52、i=1 to dim4(days) by 2;DIMn函数常用于不知道数组元素的情况下,如用*创建的数组。·LBOUNDn(array-name)&HBOUNDn(array-name):计算数组第n维的下届与上届,第一维时省略n,例如:array years72:76 first second third fourth fifth;do i=lbound(years) to hbound(years);if yearsi=99 then yearsi=.;end;这两个函数常用于用上下界形式创建的数组的情况下。思考题3:为什么数组名与同data步的变量名不能同名?思考题4:
53、像其他语言一样,数组标号从0开始有什么好处吗? 9.流程结构:顺序、选择、循环程序语言中的流程结构用于控制各计算操作执行的次序。每一种结构化语言编写的程序都由由顺序、选择、循环三种结构构成,SAS也是如此,不同语言之间只是关键字不一样罢了。顺序结构就是指程序执行是按照代码书写的顺序进行的。下面主要讲选择和循环结构。 9.1 选择结构语句一:IF expression THEN statement;<ELSE statement;>语句二:SELECT <(select-expression)>WHEN-1 (when-expression-1 <
54、;., when-expression-n>) statement;<. WHEN-n (when-expression-1 <., when-expression-n>) statement;><OTHERWISE statement;>根据它的语法结构发现有两种写法,举例如下既可以把表达式放在select语句这里,when语句那里只需要选择表达式的值;也可以select语句这里为空,整个选择条件放到when语句中;而不能两种方式混合使用。方法一select(x);when (2) put 'two'end;方法二select;whe
55、n (x=2) put 'two'end;错误的方法select (x);when (x=2) put 'two'end;对于select选择结构还有一点要注意的地方,就是select与end之间的程序的执行顺序,这跟其他语言(如C语言)可能有点差别,那就是只要有一个条件满足那么就会跳出选择结构,而不是继续执行下面的语句,这样一来就不需要显性的去跳出选择结构。 9.2 循环结构语句一:DO WHILE (expression);.more SAS statements.END;语句二:DO UNTIL (expression);.more SAS st
56、atements.END;语句三:DO index-variable=start <TO stop> <BY increment> <WHILE(expression) | UNTIL(expression)>. . . more SAS statements . . .END;例如:do i=1 to 10;do i='01JAN90'd to '01JAN90'd by 1;do i=10 to 0 by -1 while(month='JAN');这个就是常见的步长型循环结构,而且还可以结合While与U
57、ntil使用来终止循环。那么这里如果do后面什么都不写是否是“无限”循环了呢?留作读者思考。语句四:DO item-1<,item-n><WHILE(expression) | UNTIL(expression)>. . . more SAS statements . . .END;例如:do count=2,3,5,7,11,13,17;do month='JAN','FEB','MAR'do i='01JAN2001'd,'25FEB2001'd,'18APR2001'd
58、;这个语句是SAS比较特殊的循环结构,可以对枚举的项目依次执行,终止循环就是执行完这些列举的项目。语句五:DO over array-name;. . . more SAS statements . . .END;例如:data test; input sc01-sc05; array s sc01-sc05; do over s; s= s*100; end; cards;0.95 0.88 0.57 0.90
59、 0.65;这个语句也是SAS比较特殊的循环结构,专用于数组,将数组的每一个元素访问一遍。 9.3 语句块DO;.more SAS statements.END;有时候我们需要把很多语句放在一起执行,特别是放在选择结构和循环结构中,这相当于有些语言的一对。 9.4 如何跳出选择结构和循环体?continue语句:用于跳出当次循环,重新执行循环体并计算是否满足条件。leave语句:用于终止循环和选择结构,不再执行循环语句而转到循环语句之后紧接的语句。return语句:用于跳出当次data步自循环,重新执行data步。go to语句与标号:用于跳转到指定标号的语句,但该语句要求与当前语句是在同一个data步中。在大多数情况下,使用go to语句的程序段完全可以用do;.end;程序块或者ifelse结构来代替,而且使用go to语句会使程序显得复杂、难以理解和维护,所以建议还是少用。但是这个语句既然存在还是有一些用处的,可以用来跳出某些深层嵌套的结构,如跳出多层循环。第二章语言基础(函数、逻辑库与数据集)10.函数与参数(function and parameter)函数的本质是一个子程序,它能提供一些小的功能模块,不用去自己写一些代码。事实上,这些代码即使自己想写也不一定能写出来,简单的求绝对值之类的可能还 凑合,有些书把它作为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民非内部控制制度
- 济南工会内部控制制度
- 海尔内部核管理制度
- 营口理工学院《高分子材料成型模具》2024-2025学年第二学期期末试卷
- 煤矿内部罚款制度规定
- 环卫办公室内部控制制度
- 画室内部规章制度
- 监理企业内部制度
- 监理单位内部规章制度
- 禁毒大队内部管理制度
- 医药行业合规管理手册
- 数学试题卷+答案解析【中国第一高中】【湖北卷】湖北省2025年华中师大一附中2025年高考学科核心素养卷暨考前测试卷(最后一卷)(5.31-6.1)
- 2025江苏省国信集团有限公司招聘30人笔试题库历年考点版附带答案详解
- 开荒保洁培训课件
- 非学历教育合作办学协议
- 铁路押运安全培训课件
- 一年级下册道德与法治复习计划
- 走进物联网 第2版 课件2.3 物联网的无线传感网络技术
- 警察车辆盘查课件
- 2024-2025学年苏州信息职业技术学院单招《职业适应性测试》真题【全优】附答案详解
- 肝性脑病精准治疗策略-洞察及研究
评论
0/150
提交评论