SAS中DATA步运行包含两个阶段:
- 编译阶段
- 运行阶段
一、编译阶段
- 检查语法错误
常见语法错误:关键字和变量拼写错误、标点符号缺失、选项无效等 - 创建Input butter缓冲区----->Raw data时才创建。
- 创建PDV
- 创建数据集的描述性部分
Input butter缓冲区 :DATA中Input语句中从Raw Data中读取数据时,才会创建缓冲区;如果使用set语句读取SAS数据集时,则将数据直接复制到PDV中,而不创建缓冲区。
二、执行阶段
- DATA步每执行一个周期,称作一个循环,所以在data步中的变量顺序,就是数据集中的变量顺序
- 每次循环在PDV中的变量初始化成缺失值,循环计数_N_=1
- input语句从infile语句中定义的文件中读取一条记录,并写入PDV中
- 判断是否读入结束
- 执行其他语句,其他语句可以更改当前观测
- 每次DATA步结尾的时候,PDV中的值,会写入SAS数据集,然后回到data步的顶端。
- data步执行直到读取到文件的末尾,结束
- 并生成SAS log,记录raw data中的数据全部读取完成,读取了数据集的观测数和变量数。
三、PDV(Program Data Vector):
- 用于存放数据集的变量和自动变量,DATA步每读入一行记录,就存入PDV中,数据来自于Input butter或SAS执行语句。
- 自动变量(不会写入数据集):
_N_:从1开始,每执行一次DATA步就加一。
_ERROR_:
0---表示没有错误,默认值。
1---表示有1个或多个错误。 - DATA步执行一次,就读取一行 外部文件,除非使用其他特殊语句
- 编译时PDV的变化依次如下图:
图片来源:碧水幽幽泉的博客
四、读Raw data时,以下情况不会置为缺失值:
- 在Retain语句中的变量
- 在SUM语句中创建的变量
- 数组中的成员变量
- 在FILE or INFILE语句中创建的变量
- 自动变量
五、执行阶段错误:
1、在log中note warning error 信息
2、在log中PDV中存储的值
3、当前步停止
六、如何测试程序:
- 写一个空数据集:DATA NULL;
如果外部文件特别大,创建数据集会很耗时间,可以用这种方法看一下语法对不对 - 减少观测数
- 使用put语句:
字符串---用引号引起来
数据集中的变量
自动变量:_N_,_ERROR_,_ALL_
条件处理语句