DATA步中PDV(Program Data Vector)

目录

一、编译阶段

1、扫描SAS语句、语法检查、变量标识

2、创建输入缓冲区

3、创建程序数据向量

4、创建数据集描述符信息

二、运行阶段

1、运行步骤

2、读Raw data时,以下情况不会置为缺失值

三、如何测试程序


SAS中DATA步运行包含两个阶段: 编译阶段、运行阶段

一、编译阶段

1、扫描SAS语句、语法检查、变量标识(名称、类型、长度等)

  1. 关键字和变量拼写错误、标点符号缺失、引号不匹配、选项无效等。
  2. SAS语法错误有两大类
    ERROR(红色)————需要修正后,才能正常执行。举例:指定了不存在的数据集
    WARNING(绿色)———代码依然能正常运行。

2、创建输入缓冲区(Input butter,IB)---->从Raw data读取数据时才创建。

DATA中Input语句中从Raw Data中读取数据时,才会创建缓冲区;如果使用set语句读取SAS数据集时,则将数据直接复制到PDV中,而不创建缓冲区。

3、创建程序数据向量(Program Data Vector,PDV)

  1. 存放内容:数据集的变量、计算列信息。
  2. DATA步每读入一行记录,就存入PDV中,数据来自于缓冲区IB或SAS执行语句。
  3. 自动变量(不会写入数据集):
    _N_:从1开始,每执行一次DATA步就加一。
    _ERROR_:
                     0---表示没有错误,默认值。
                     1---表示有1个或多个错误。
  4. DATA步执行一次,就读取一行外部文件,除非使用其他特殊语句

4、创建数据集描述符信息(Descriptor Information,DI)

包括数据集属性和变量属性。

比如:数据集名字、成员类型、创建日期、创建时间、观测数、变量名称、类型(字符型/数值型)等。

二、运行阶段

1、运行步骤

  1. DATA步每执行一个周期,称作一个循环,所以在data步中的变量顺序,就是数据集中的变量顺序,一次执行时,PDV中的内部变量初始化:_N_=1、_ERROR_=0;
  2. 每次循环_N_自动加1。SAS会将以INPUT语句和赋值语句创建的变量初始化为缺失值;而以SET、MERGE、MODIFY或UPDATE语句读取的变量会保留上次读取PDV的变量值,直到被新读取的观测覆盖。
  3. input语句从infile语句中定义的文件中读取一条记录,并写入PDV中
  4. 判断是否读入结束:如果没有读入结束→5、6,如果读入结束→7
  5. 执行其他语句(赋值语句,计算语句,更新语句等)
  6. 每次DATA步结尾的时候,隐含的SAS语句(OUTPUT、RETURN、RESET)被自动触发。PDV中的变量会作为一个观测写入SAS数据集,然后回到data步的顶端。
  7. 编译执行下一个DATA步或PROC步
  8. 并生成SAS log,记录raw data中的数据全部读取完成,读取了数据集的观测数和变量数。
  9. 编译时PDV的变化依次如下图:
    图片来源:碧水幽幽泉的博客

2、读Raw data时,以下情况不会置为缺失值:

  1. 在Retain语句中的变量
  2. 在SUM语句中创建的变量
  3. 数组中的成员变量
  4. 在FILE or INFILE语句中创建的变量
  5. 自动变量

三、如何测试程序:

  1. 写一个空数据集:DATA NULL;
    如果外部文件特别大,创建数据集会很耗时间,可以用这种方法看一下语法对不对
  2. 减少观测数
  3. 使用put语句:
    字符串---用引号引起来
    数据集中的变量
    自动变量:_N_,_ERROR_,_ALL_
    条件处理语句
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Miya_o00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值