SAS中文论坛
标题:
关于PDV的总结
[打印本页]
作者:
shiyiming
时间:
2013-4-14 11:24
标题:
关于PDV的总结
以下是个人对PDV的粗浅总结,希望各位高手补充指正。
什么是PDV
个人认为可以把PDV想象成一排用于存放变量值的盒子。每个盒子代表一个变量。
提交一个DATA步后,SAS会对这个DATA步进行编译,然后执行。
首先,PDV是在DATA步的编译阶段生成的。(编译会进行语法检查并创建一排整齐摆放的”盒子”);
然后,在DATA步的执行阶段,根据不同语句对PDV中变量的值进行清空或更改。(将盒子清空或换上新的物品);
最后,在RUN;语句或者OUTPUT;语句将PDV中变量的当前值输出到目标数据集中。KEEP,DROP语句或KEEP=,DROP=数据集选项会影响输出到目标数据集中变量的个数。(如果没有KEEP/DROP,将新建变量和数据集变量对应的盒子搬出到目标数据集;如果只有KEEP,则只搬KEEP指定的盒子;如果只有DROP,则不搬DROP指定的盒子;如果KEEP/DROP同时存在,则只搬KEEP-DROP后剩下的盒子)
PDV中变量的个数及顺序
DATA步中所涉及到的所有的变量,包括新创建的、从其他数据集读取的(SET)、以及自动生成的变量。自动生成的变量包括:_ERROR_,_N_; 或是FIRST.VAR,_IORC_等由某个语句或选项所自动产生的变量。默认情况下,自动生成的变量不会输出到目标数据集中。
PDV中变量按照先来后到的原则,是根据其在DATA步中第一次出现的位置决定整个PDV中的变量顺序。同样,这是在DATA步的编译阶段确定的。(在SET语句中,数据集选项IN=所指定的变量会在数据集变量之前)PUT _ALL_; 语句会将PDV中所有的变量按照其在PDV中的顺序输出到log中。
例如下面这个例子:
data test;
aaa=1;
set sashelp.class(keep=name sex in=in1);
by name;
bbb="bbb";
set sashelp.class(keep=age weight height in=in2);
put _all_;
run;
在PDV中共有13个变量,包括两个新创建的(aaa,bbb),5个数据集中的,6个自动生成的(in1,first.name,last.name,in2, _error_, _n_)。
顺序为:aaa, in1, name, sex, first.name, last.name, bbb, in2, age, weight, height, _error_,_n_。
关于PDV中变量值的RETAIN
一般情况下,DATA步的执行是一个循环的过程,也就是SAS运行到DATA步最后一句后会默认回到DATA语句继续执行。在回到DATA语句再次执行这个DATA步的代码的时候,就会涉及到是否对PDV中变量已有的值清空,这就是RETAIN要做的。
(这里用“一般情况下”,是因为有些情况下,SAS不会回到DATA语句,而是在RUN;语句就结束了。如: *** No data read from outside;
data a;
put _all_;
x=1;
run;
*** No data read from the first iteration(_N_=1);
data b;
x=2;
put _all_;
if x=1 then set sashelp.class;
run;
)
回到PDV:
a. 在DATA步刚开始执行的时候:
自动生成变量会被附上初始值:_N_=1, _ERROR_=0,FIRST.VAR=1, LAST.VAR=1, 等等;
如果RETAIN语句对某变量设置了的初始值,则对应的变量被设为指定的值;
SUM语句(如a+1;)的变量会被初始化为0;
其他的变量,包括新建变量和SET的数据集对应的变量都会被设为空值。
b. 当SAS执行过程中再次回到DATA语句时:
自动生成变量的值会被retain;
如变量来自RETAIN语句、SUM语句、或数据集中,则变量值会被retain;
其他的变量会被置空。
例如,可以根据下面DATA步所产生的log来判断变量的retain情况: proc sort data=sashelp.class;
by age;
run;
data test;
put "===============================";
put "At begnning: " _all_;
aaa=_N_;
set class(keep=name age in=in1);
by age;
bbb+age;
retain ccc 0; ccc=age+ccc;
retain ddd; ddd=sum(ddd,age);
put "At ending : " _all_;
run;
转自 <!-- m --><a class="postlink" href="http://bbs.pinggu.org/forum.php?mod=viewthread&tid=2337851&fromuid=3554347">http://bbs.pinggu.org/forum.php?mod=vie ... id=3554347</a><!-- m -->
作者:
shiyiming
时间:
2013-5-14 15:00
标题:
Re: 关于PDV的总结
一直在想PVD怎么个翻译,是程序数据矢量么?
支持原创!
作者:
shiyiming
时间:
2013-6-1 22:54
标题:
Re: 关于PDV的总结
<!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
作者:
Emma
时间:
2015-7-19 22:17
shiyiming 发表于 2013-4-14 11:24
以下是个人对PDV的粗浅总结,希望各位高手补充指正。
好文
欢迎光临 SAS中文论坛 (https://mysas.net/forum/)
Powered by Discuz! X3.2