SAS中的PDV机制

在SAS中,我们使用DATA步来读入数据,DATA步在读入数据时实际上有两个阶段:
编译(compilation)
执行(execution)

过程如下:

  1. 在编译阶段中,逐个扫描语句,如果发现语法错误,SAS报错并终止运行;如果编译阶段中没有发现任何语法错误,进入执行阶段。
  2. 在执行过程中,DATA部读入第一条数据,在SAS中创建第一条观测;读入第二条数据,在SAS中创建第二条观测;读入第三条数据,在SAS中创建第三条观测……直至读入最后一条数据并在SAS中创建最后一条观测。我们可以把这个过程当做隐式循环(和DO,DO WHILE,DO UNTIL语句区分,它们是显示循环)。

可以用过下面的程序来看PDV的过程


data tes2t;

   put "第" _n_ "次运行之前:"_all_;

   set sashelp.class;

   htm=height*2.54/100;  /*身高转换为米*/

   wtkg=weight*0.454;    /*体重转换为公斤*/

   put "第" _n_ "次运行之后:" _all_;

run;

运行之后可以查看日志:

SAS中的PDV机制
日志就是PDV的过程所示:
  1. SAS在编译阶段会创建PDV(program data vector),PDV其实就是内存中的一块区域,日志中的第一行就是编译阶段编译的。在PDV中加入变量(读取数据集中的变量和新创建的变量)并且赋值缺失。
    注意:在PDV中有两个自动变量,N_和_ERROR 。N =1表示正在创建第一条观测,N =2表示正在创建第二条观测,依次类推。
    _ERROR_只有0和1两个取值,等于0表示在创建当前观测时未发现错误,等于1表示在创建当前观测时发现错误。
    除了这两个自动变量外,若数据进行排序分类后还可自动产生first.和last.变量,当然PDV中还有输入数据集的变量和新创建的变量。
    PDV中的变量按照先来后的原则决定了在PDV中变量的先后顺序位置
  2. SAS进行执行阶段,每次循环开始时不是输入数据集读入的变量置为缺失,将输入数据集的观测直至循环完毕,继续执行数据步中的其他语句,当然数据步中的其他语句也可能会对PDV的数据进行修改,数据步的最后会将PDV里面的内容写入新生成的数据集中。

retain语句就是利用PDV的机制实现赋值功能的:
不使用RETAIN,INPUT在每次循环执行时会把PDV中的变量值清空,即置为(.)。
使用RETIAN,INPUT在每次循环执行时保留上一次PDV中的变量值。

Original: https://blog.csdn.net/fenghuanxia66/article/details/127826678
Author: 浪丫头
Title: SAS中的PDV机制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/661067/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球