以下是个人对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 out=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;

转载于:https://www.cnblogs.com/xhety/p/3475140.html

Chapter002[SAS DATA步之全解密-01]相关推荐

  1. 从程序员到数据科学家:SAS 编程基础 (06)- DATA步与PDV

    在BASE SAS 中,DATA 语句用于开始一个数据步, 后续为若干DATA步特定的语句:SAS数据步结束于下一个 DATA 步或 PROC 步开始之处,或者结束于后续显式指定的RUN语句. 注意: ...

  2. SAS学习笔记之《SAS编程与数据挖掘商业案例》(4)DATA步循环与控制、常用全程语句、输出控制...

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(4)DATA步循环与控制.常用全程语句.输出控制 1. 各种循环与控制 DO组 创建一个执行语句块 DO循环 根据下标变量重复执行DO和E ...

  3. SAS(八)SAS之DATA步--文件操作语句

    SAS(八)DATA步 绝大部分的SAS语句都可分为两步:DATA步(打开.编辑.整理数据)和PROC步(分析.处理.显示数据)组成的,今天我们来学习DATA步相关知识点. DATA步主要是运用到以下 ...

  4. python读取sas数据集_SAS之DATA步运行机制

    相信了解SAS软件的朋友都知道,SAS主要由DATA步和PROC步组成,其中DATA步作为数据读入.清洗.整理的主要程序步,学好DATA就显得尤为重要.而了解DATA步,重中之重就得了解PDV(Log ...

  5. SAS数据步与过程步,数据步语句

    SAS数据步与过程步,数据步语句 http://www.biostatistic.net/thread-2045-1-1.html  ---转载---原文作者:biostar (出处: 生物统计家园) ...

  6. sas Data步数据读取流程详解

    data me; put _n_= x=;/*******1******/ input x/*input这里是读入缓冲流的关键步骤变量是从缓冲流中取出数据,根据缓冲流中指针的位置来获取变量信息*/; ...

  7. 【原创】植物大战僵尸全解密---存档篇

    2010-04-13 更新了一点,尽量把demo做成program 2010-04-12 原来的程序在删除用户时,没有删除对应用户的游戏进度.现在修正 另外告诉大家一个关于游戏的小密秘.在帖子的最后. ...

  8. 植物大战僵尸全解密---存档篇[转]学习内存读写的方法

    标 题: [原创]植物大战僵尸全解密---存档篇 作 者: cntrump 时 间: 2010-04-11,21:44:09 链 接: http://bbs.pediy.com/showthread. ...

  9. SAS过程步常用语句

    一.print过程 print过程可以打印一个SAS数据集中的全体或部分观测值,还可以打印数 值变量的综合或部分和. print过程中经常使用的语句有: proc print [选择项]; var 变 ...

最新文章

  1. 匿名函数应用-多线程测试代码
  2. linux+用户的shell,Linux用户管理(十)Linux Shell高级
  3. 单击CheckBox,全选GridView中所有CheckBox
  4. Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
  5. 我的开源 GitBook: Python 之旅
  6. vue 鼠标点击事件_VBA代码解决方案第115讲:点击鼠标实现精准控制触发事件的VBA代码第二方案...
  7. java 线程由浅入深_Java多线程:由浅入深看synchronized的底层实现原理
  8. 蓝桥杯(java)基础练习 龟兔赛跑
  9. Listview的OnScrollListener的滑动监听实现分页加载
  10. Unity变量命名的6个重要提示
  11. MySQL内核月报 2014.09-MySQL· 捉虫动态·auto_increment
  12. information_schema系列五(表,触发器,视图,存储过程和函数)
  13. eclipse中maven项目pom文件第一行报错解决方法
  14. isis协议_ISIS与OSPF之间有什么差异?
  15. Redis,唯快不破!
  16. HDU-1042 N!
  17. VC2012 学习记录
  18. 关于Winxp U盘无法复制磁盘写保护解决方法
  19. 一个人越想挣钱,越挣不到钱!背后的原因是什么?
  20. 传奇GEE引擎版本架设

热门文章

  1. CyberLink YouCam Deluxe 4.0.913 With Serial Key.torrent
  2. 感性,有时候是阻碍我们进步的最大障碍
  3. php中加入 空格的代码,在HTML中插入空格的几种方法
  4. Gaint 自行车知识及价格表
  5. 【学习报告】22.9.24-22.9.26
  6. linux如何运行windows游戏,Steam 让我们在 Linux 上玩 Windows 的游戏更加容易
  7. 用tutle库绘制阴阳图案
  8. HTML(基于Java开发的学习)
  9. 苹果MacBook Air 2022款 评测
  10. 其实,家家都有本难念的经