SAS数据步编译与执行
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
数据步入门
但SAS是一个专用的数据处理语言,所以,这个程序 运行到RUN语句后,先把读入的观测(这是第一个观 测)写入输出数据集;并继续执行下面步骤。 ⑹又返回到DATA语句后的第一个可执行语句开始执 行,并先把所有的变量置初值为缺失值.于是,第一个 PUT语句的结果显示三个变量均为缺失值,而不是上 一步的10、20、30。 ⑺下一个INPUT语句从数据行中读入下一个观测, 把变量X、Y赋值100、200。读取位置由运行时设置的 一个数据指针指示。然后计算变量Z的值得300。 于是PUT语句输出的X、Y、Z值分别为100、200、300。
将 M 13.3 0.133写入数据集bodyfat
15
一个观测被处理完后,这时SAS系统首先将程 序数据列中的数据写入数据集中(两个自动变量的值 并不写入,此值可在其他编程是使用),同时SAS系 统将控制又返回到DATA步的开头,程序开始第二 个观测的处理,此过程一直到没有观测要处理为止。
16
17
程序数据列 |_N_|_ERROR_|SEX|FATPCT|FAT| | | | | | |
数据集名:bodyfat 到RUN时也已知)
变量的个数(从PDV中可知) 观测个数(执行 变量名及属性(从PDV中可知)
14
执行阶段
data bodyfat; inPUt sex $ fatpct ; fat=fatpct/100; cards; M 13.3 F 22 RUN; data bodyfat; inPUt sex $ fatpct ; fat=fatpct/100; cards; M 13.3 F 22 RUN; data bodyfat; inPUt sex $ fatpct ; fat=fatpct/100; cards; M 13.3 F 22 RUN;
1
数据步入门
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 ; (sasLan21.sas)
数据步入门
数据步流程图
8
数据步的编译和执行阶段
编译阶段(Compilation Phase):在这个阶段,系统扫描每个语 句检查它是否有语法错误。大部分语法错误导致系统无 法对数据步作进一步的处理。在编译阶段将建立要创建 的数据集的描述部分。 执行阶段(Execution Phase):若数据步编译成功,就开始执行 阶段。在这个阶段对源数据文件的每一条记录斗执行一 次数据步,除非在程序中指明其它处理方式。在这个阶 段建立数据集的数据部分。
2
数据步入门
运行后在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.
数Hale Waihona Puke 步入门SAS语言是一种专用的数据管理、分析语言,它提 供了很强的数据操作能力。这些数据操作能力表现在 它可以容易地读入任意复杂格式的输入数据,并可以 对输入的数据进行计算、子集选择、更新、合并、拆 分等操作。另外,SAS系统还提供了用来访问其它数 据库系统如Sybase、Oracle的接口,访问各种微机使 用的数据库文件,如FoxPro、Excel的接口及向导, 并提供了一个SQL过程来实现数据库查询语言SQL的功 能。 SAS语言直接、间接用于数据管理的语句很多,本 章只能介绍最常用的一些语句。
10
编译阶段(Compilation Phase):
语法检查的主要内容: 漏掉或错拼的关键词 无效的变量名 遗漏或错误的符号 无效的选择项 在内存中建立程序数据列PDV 用于建立SAS系统的数据集,一次只处理一个观测 两个自动变量 _N_ 记录DATA步执行的次数 _ERROR_指示出错信息. 0表示无错误,1表示有错误 PDV的一般格式: |_N_|_ERROR_| |
9
数据步的编译阶段
对程序进行词语和语法检查,检查它是否有语法错误; 将程序转换为机器码,供执行阶段使用; 建立工作部件输入缓冲器(Input Buffer); 建立工作部件PDV(程序数据列)(Program Data Vector); 建立数据集中各个变量的三个必须的属性: Name,Type,Length; 建立新建数据集的描述部分。
2 100 200 300
6
数据步入门
从这个例子可以看出SAS数据步程序和普通程序的 一个重大区别:SAS数据步如果有数据输入,比如用 INPUT、SET、MERGE、UPDATE、MODIFY等语句读入数 据,则数据步中隐含了一个循环,即数据步程序执行到 最后一个语句后,会返回到数据步内的第一个可执行 语句开始继续执行,直到读入数据语句(INPUT、SET、 MERGE、UPDATE、MODIFY等)读入了数据结束标志为 止才停止执行数据步,并把读入的各个观测写入在 DATA语句中指定的数据集内。如果没有数据输入而只 是直接计算,则数据步程序不需要此隐含循环。数据 步因为有这样一个隐含循环,所以也提供了用来查询 某一步是第几次循环的特殊变量_N_,它的值为数据步 7 循环计数值。
11
建立数据集的描述部分 数据集名 观测数和变量个数 变量名及其属性
12
执行阶段(Execution Phase): 创建数据集的数据部分 执行顺序 PDV中外部为题初始化为缺省值 输入每条记录至输入缓冲器,按INPUT语句读至PDV 按数据步的其它语句处理后存入PDV 在数据步结束时缺省地将PDV的内容作为一条观测 写入新的数据集 回到数据步的开始.使PDV中外部变量初始化为缺省值 对源文件中每条记录都按上述步骤执行一次 当对源文件最后一条记录执行结束后,数据步执行完成.
初始缺省值
程序数据列 |_N_|_ERROR_|SEX|FATPCT|FAT| |1 | 0 | | . | . |
程序数据列 |_N_|_ERROR_|SEX|FATPCT|FAT| |1 | 0 | M | 13.3 | . |
程序数据列 |_N_|_ERROR_|SEX|FATPCT|FAT| |1 | 0 | M | 13.3 | 0.133 |
5
数据步入门
⑻然后,运行控制跳过CARDS语句到空语句,到数据步 结尾,把第二个观测输出到数据集, ⑼再返回到数据步开头,把变量值赋初值为缺失值, 所以第一个PUT语句输出的三个变量值为缺失值。 ⑽然后运行到INPUT语句,应该读入下一个观测,但 是查询数据指针发现已经读完了所有数据,所以本数据 步结束,并把两个观测写入数据集WORK.A中。 显示此数据集的内容如下: 提交 OBS X Y Z PROC PRINT; 1 10 20 30 RUN;
这个程序的运行流程是这样的: ⑴ DATA语句标志了数据步开始,并指定了数据步 结束时要生成的数据集名字为A(实际是WORK.A)。
3
数据步入门
⑵第一个PUT语句要输出变量X、Y、Z的值,但它们还 都没有定义,所以LOG窗口的结果显示为三个缺失值. ⑶下面是INPUT语句,它从CARDS语句后面的数据行 中读取变量X的值10,变量Y的值20。 ⑷下一个赋值语句计算变量Z的值得到30。因此, LOG窗口中的第二行输出显示三个变量的值分别为10、 20、30。 ⑸从CARDS语句开始到空语句(;)的各行是非执行 的,程序运行到RUN语句,发现这是本数据步的最后一 个语句,按一般的程序语言的规则,程序到这里就应 该结束了,程序中的第二行数据100 200就不能被读入.
13
编译阶段
data bodyfat; inPUt sex $ fatpct; fat=fatpct/100; cards; M 13.3 F 22 RUN;
程序数据列 |_N_|_ERROR_|SEX|FATPCT| | | | | |
data bodyfat; inPUt sex $ fatpct ; fat=fatpct/100; cards; M 13.3 F 22 RUN;
数据步入门
但SAS是一个专用的数据处理语言,所以,这个程序 运行到RUN语句后,先把读入的观测(这是第一个观 测)写入输出数据集;并继续执行下面步骤。 ⑹又返回到DATA语句后的第一个可执行语句开始执 行,并先把所有的变量置初值为缺失值.于是,第一个 PUT语句的结果显示三个变量均为缺失值,而不是上 一步的10、20、30。 ⑺下一个INPUT语句从数据行中读入下一个观测, 把变量X、Y赋值100、200。读取位置由运行时设置的 一个数据指针指示。然后计算变量Z的值得300。 于是PUT语句输出的X、Y、Z值分别为100、200、300。
将 M 13.3 0.133写入数据集bodyfat
15
一个观测被处理完后,这时SAS系统首先将程 序数据列中的数据写入数据集中(两个自动变量的值 并不写入,此值可在其他编程是使用),同时SAS系 统将控制又返回到DATA步的开头,程序开始第二 个观测的处理,此过程一直到没有观测要处理为止。
16
17
程序数据列 |_N_|_ERROR_|SEX|FATPCT|FAT| | | | | | |
数据集名:bodyfat 到RUN时也已知)
变量的个数(从PDV中可知) 观测个数(执行 变量名及属性(从PDV中可知)
14
执行阶段
data bodyfat; inPUt sex $ fatpct ; fat=fatpct/100; cards; M 13.3 F 22 RUN; data bodyfat; inPUt sex $ fatpct ; fat=fatpct/100; cards; M 13.3 F 22 RUN; data bodyfat; inPUt sex $ fatpct ; fat=fatpct/100; cards; M 13.3 F 22 RUN;
1
数据步入门
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 ; (sasLan21.sas)
数据步入门
数据步流程图
8
数据步的编译和执行阶段
编译阶段(Compilation Phase):在这个阶段,系统扫描每个语 句检查它是否有语法错误。大部分语法错误导致系统无 法对数据步作进一步的处理。在编译阶段将建立要创建 的数据集的描述部分。 执行阶段(Execution Phase):若数据步编译成功,就开始执行 阶段。在这个阶段对源数据文件的每一条记录斗执行一 次数据步,除非在程序中指明其它处理方式。在这个阶 段建立数据集的数据部分。
2
数据步入门
运行后在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.
数Hale Waihona Puke 步入门SAS语言是一种专用的数据管理、分析语言,它提 供了很强的数据操作能力。这些数据操作能力表现在 它可以容易地读入任意复杂格式的输入数据,并可以 对输入的数据进行计算、子集选择、更新、合并、拆 分等操作。另外,SAS系统还提供了用来访问其它数 据库系统如Sybase、Oracle的接口,访问各种微机使 用的数据库文件,如FoxPro、Excel的接口及向导, 并提供了一个SQL过程来实现数据库查询语言SQL的功 能。 SAS语言直接、间接用于数据管理的语句很多,本 章只能介绍最常用的一些语句。
10
编译阶段(Compilation Phase):
语法检查的主要内容: 漏掉或错拼的关键词 无效的变量名 遗漏或错误的符号 无效的选择项 在内存中建立程序数据列PDV 用于建立SAS系统的数据集,一次只处理一个观测 两个自动变量 _N_ 记录DATA步执行的次数 _ERROR_指示出错信息. 0表示无错误,1表示有错误 PDV的一般格式: |_N_|_ERROR_| |
9
数据步的编译阶段
对程序进行词语和语法检查,检查它是否有语法错误; 将程序转换为机器码,供执行阶段使用; 建立工作部件输入缓冲器(Input Buffer); 建立工作部件PDV(程序数据列)(Program Data Vector); 建立数据集中各个变量的三个必须的属性: Name,Type,Length; 建立新建数据集的描述部分。
2 100 200 300
6
数据步入门
从这个例子可以看出SAS数据步程序和普通程序的 一个重大区别:SAS数据步如果有数据输入,比如用 INPUT、SET、MERGE、UPDATE、MODIFY等语句读入数 据,则数据步中隐含了一个循环,即数据步程序执行到 最后一个语句后,会返回到数据步内的第一个可执行 语句开始继续执行,直到读入数据语句(INPUT、SET、 MERGE、UPDATE、MODIFY等)读入了数据结束标志为 止才停止执行数据步,并把读入的各个观测写入在 DATA语句中指定的数据集内。如果没有数据输入而只 是直接计算,则数据步程序不需要此隐含循环。数据 步因为有这样一个隐含循环,所以也提供了用来查询 某一步是第几次循环的特殊变量_N_,它的值为数据步 7 循环计数值。
11
建立数据集的描述部分 数据集名 观测数和变量个数 变量名及其属性
12
执行阶段(Execution Phase): 创建数据集的数据部分 执行顺序 PDV中外部为题初始化为缺省值 输入每条记录至输入缓冲器,按INPUT语句读至PDV 按数据步的其它语句处理后存入PDV 在数据步结束时缺省地将PDV的内容作为一条观测 写入新的数据集 回到数据步的开始.使PDV中外部变量初始化为缺省值 对源文件中每条记录都按上述步骤执行一次 当对源文件最后一条记录执行结束后,数据步执行完成.
初始缺省值
程序数据列 |_N_|_ERROR_|SEX|FATPCT|FAT| |1 | 0 | | . | . |
程序数据列 |_N_|_ERROR_|SEX|FATPCT|FAT| |1 | 0 | M | 13.3 | . |
程序数据列 |_N_|_ERROR_|SEX|FATPCT|FAT| |1 | 0 | M | 13.3 | 0.133 |
5
数据步入门
⑻然后,运行控制跳过CARDS语句到空语句,到数据步 结尾,把第二个观测输出到数据集, ⑼再返回到数据步开头,把变量值赋初值为缺失值, 所以第一个PUT语句输出的三个变量值为缺失值。 ⑽然后运行到INPUT语句,应该读入下一个观测,但 是查询数据指针发现已经读完了所有数据,所以本数据 步结束,并把两个观测写入数据集WORK.A中。 显示此数据集的内容如下: 提交 OBS X Y Z PROC PRINT; 1 10 20 30 RUN;
这个程序的运行流程是这样的: ⑴ DATA语句标志了数据步开始,并指定了数据步 结束时要生成的数据集名字为A(实际是WORK.A)。
3
数据步入门
⑵第一个PUT语句要输出变量X、Y、Z的值,但它们还 都没有定义,所以LOG窗口的结果显示为三个缺失值. ⑶下面是INPUT语句,它从CARDS语句后面的数据行 中读取变量X的值10,变量Y的值20。 ⑷下一个赋值语句计算变量Z的值得到30。因此, LOG窗口中的第二行输出显示三个变量的值分别为10、 20、30。 ⑸从CARDS语句开始到空语句(;)的各行是非执行 的,程序运行到RUN语句,发现这是本数据步的最后一 个语句,按一般的程序语言的规则,程序到这里就应 该结束了,程序中的第二行数据100 200就不能被读入.
13
编译阶段
data bodyfat; inPUt sex $ fatpct; fat=fatpct/100; cards; M 13.3 F 22 RUN;
程序数据列 |_N_|_ERROR_|SEX|FATPCT| | | | | |
data bodyfat; inPUt sex $ fatpct ; fat=fatpct/100; cards; M 13.3 F 22 RUN;