第二章 SAS语言基础 (程序结构、数据类型、表达式与语句) 如果你曾经学过一门语言的话,就应该知道语言基础这里会讲些什么内容了。其实各种语言的语法套路是差不多的,无非就是数据类型、变量、常量、运算符、流程结构、函数以及输入输出等。 SAS程序的一般过程 数据步常用于创建数据集 原始 数据步 数据 DATA步 SAS表 SAS表 PROC过程步 报告 过程步常用于处理数据集(生成 报表、图形和实现数据分析功能)
1. 第一个SAS程序(SAS program) title \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程序的层次是非常清楚的,因为它是模块化的。每一个SAS程序是有若干个语句组成,看起来可能非常复杂松散,而实际上SAS程序是两个模块化的结构构成即数据步和过程步,以及一些设置环境变量的全程语句。上面程序中,第一个语句是标题语句,也即是全程语句。data语句到第7行单独的分号被称为数据步,proc语句到run;语句被称为过程步。而且有些语句是专用于数据步的,比如input语句和cards语句;而有些语句是专用于过程步,如var语句和class语句;还有些语句是可以单独放在任何位置,称为全程语句。
1.1 程序结构:
数据步(Data step):用来创建和修改用于统计分析的数据集,实现基础的编程功能;每个data步以data语句开始,可以包含任意多个SAS程序语句。
过程步(Proc step):利用已创建的数据集完成特定的统计分析任务、结果输出及部分数据集整理功能。proc步以proc语句开始,数据集作为输入;其他语句给出用户想得到有关结果的更多信息的程序语句,这些语句依赖于用户调用的具体的过程。
数据步只要求以data步开始,没有其他限制;而proc步则更像一个模板,每一个过程有确定可用的语句,用户根据需要往上面填写。所以,说到SAS编程,大多的技巧和艺术都集中在数据步,过程步几乎没有任何的技巧可言,过
程步应用的好坏一方面取决于你前面数据处理的好坏,另一方面取决于用户的统计基础。
数据步的自循环(Data step's Built-in Loop):
SAS语言的编程计算功能主要在数据步实现。一个 SAS数据步相当于一个单独运行的程序。但是,SAS语言又是一个专用数据处理语言,所以SAS数据步有其它语言所没有的特点。我们以下面的简单例子说明这一点:
data a ;
put x= y= z= ; input x y ; z=x+y ;
put x= y= z= ; cards ; 10 20 100 200 ;
run ;
运行后在LOG窗口显示如下记录: ……
X=. Y=. Z=. X=10 Y=20 Z=30 X=. Y=. Z=.
X=100 Y=200 Z=300 X=. Y=. Z=.
NOTE: The data set WORK.A has 2 observations and 3 variables.
这个程序的运行流程是这样的:
⑴ DATA语句标志了数据步开始,并指定了数据步结束时要生成的数据集名字为A(实际是WORK.A)。
⑵第一个PUT语句要输出变量X、Y、Z的值,但它们还都没有定义,所以LOG窗口的结果显示为三个缺失值.
⑶下面是INPUT语句,它从CARDS语句后面的数据行中读取变量X的值10,变量Y的值20。
⑷下一个赋值语句计算变量Z的值得到30。因此,LOG窗口中的第二行输出显示三个变量的值分别为10、20、30。
⑸从CARDS语句开始到空语句(;)的各行是非执行的,程序运行到RUN语句,发现这是本数据步的最后一个语句,按一般的程序语言的规则,程序到这里就应该结束了,程序中的第二行数据100 200就不能被读入。
但SAS是一个专用的数据处理语言,所以,这个程序运行到RUN语句后,先把读入的观测(这是第一个观测)写入输出数据集;并继续执行下面步骤。
⑹又返回到DATA语句后的第一个可执行语句开始执行,并先把所有的变量置初值为缺失值。于是第一个PUT语句的结果显示三个变量均为缺失值,而不是上一步的10、20、30。
⑺下一个INPUT语句从数据行中读入下一个观测,把变量X、Y赋值100、200。读取位置由运行时设置的一个数据指针指示。然后计算变量Z的值得300。
于是PUT语句输出的X、Y、Z值分别为100、200、300。 ⑻然后,运行控制跳过CARDS语句到空语句,到数据步结尾,把第二个观测输出到数据集。
⑼再返回到数据步开头,把变量值赋初值为缺失值,所以第一个PUT语句输出的三个变量值为缺失值。
⑽然后运行到INPUT语句,应该读入下一个观测,但是查询数据指针发现已经读完了所有数据,所以本数据步结束,并把两个观测写入数据集WORK.A中。
从这个例子可以看出SAS数据步程序和普通程序的一个重大区别:SAS数据步如果有数据输入,比如用INPUT、SET、MERGE、UPDATE、MODIFY等语句读入数据,则数据步中隐含了一个循环,即数据步程序执行到最后一个语句后,会返回到数据步内的第一个可执行语句开始继续执行,直到读入数据语句(INPUT、SET、MERGE、UPDATE、MODIFY等)读入了数据结束标志为止才停止执行数据步,并把读入的各个观测写入在DATA语句中指定的数据集内。如果没有数据输入而只是直接计算,则数据步程序不需要此隐含循环。数据步因为有这样一个隐含循环,所以也提供了用来查询某一步是第几次循环的特殊变量_N_,它的值为数据步循环计数值。
数据步流程图