在SAS中,我们使用DATA步来读入数据,DATA步在读入数据时实际上有两个阶段:
编译(compilation)
执行(execution)
过程如下:
- 在编译阶段中,逐个扫描语句,如果发现语法错误,SAS报错并终止运行;如果编译阶段中没有发现任何语法错误,进入执行阶段。
- 在执行过程中,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;
运行之后可以查看日志:
日志就是PDV的过程所示:
- SAS在编译阶段会创建PDV(program data vector),PDV其实就是内存中的一块区域,日志中的第一行就是编译阶段编译的。在PDV中加入变量(读取数据集中的变量和新创建的变量)并且赋值缺失。
注意:在PDV中有两个自动变量,N_和_ERROR 。N =1表示正在创建第一条观测,N =2表示正在创建第二条观测,依次类推。
_ERROR_只有0和1两个取值,等于0表示在创建当前观测时未发现错误,等于1表示在创建当前观测时发现错误。
除了这两个自动变量外,若数据进行排序分类后还可自动产生first.和last.变量,当然PDV中还有输入数据集的变量和新创建的变量。
PDV中的变量按照先来后的原则决定了在PDV中变量的先后顺序位置 - 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/
转载文章受原作者版权保护。转载请注明原作者出处!