SAS PDV:程序数据向量的秘密[返璞归真004]

2023-10-09 12:59:42 浏览数 (3)

PDV

—回云随云雁,寒露滴鸣蛰。

01

SAS PDV,全称为程序数据向量(Program Data Vector),是SAS在执行DATA步时创建的一个内存区域,用于存储变量的当前值和一些自动生成的变量。了解PDV的作用和原理,对于写出高效、准确的SAS程序非常重要。今天,我们就来深入探讨一下SAS PDV的基本概念和应用。我们将从以下几个方面进行介绍:

  • SAS PDV是什么?
  • SAS PDV是如何生成和更新的?
  • SAS PDV有什么作用和好处?SAS PDV是什么?SAS PDV是一个逻辑内存区域,它是在DATA步的编译阶段生成的。它包含了所有变量的当前值和一些自动生成的变量,如_N_、ERROR、FIRST.、LAST.等。这些变量可以用于实现一些复杂的逻辑和功能。SAS PDV是如何生成和更新的?SAS PDV是在DATA步的编译阶段生成的,它根据DATA步中涉及到的所有变量来确定其大小和结构。在执行阶段,SAS会按照以下步骤循环处理每一行数据:
  • 从DATA语句开始,将_N_设为1,并在每次迭代后加1
  • 将PDV中的所有变量设为缺失值,并初始化自动变量
  • 用INPUT语句将一行数据从输入缓存区读入到PDV中(如果读取的是外部文件)
  • 用SET、MERGE、MODIFY或UPDATE语句将一条观测从SAS数据集读入到PDV中(如果读取的是SAS数据集)
  • 执行其他语句(如赋值语句、条件语句、循环语句等)
  • 将PDV中的变量的当前值输出到新建的数据集中
  • 判断是否到达输入文件或数据集的结尾,如果是,则结束循环;如果否,则返回到DATA语句继续下一次迭代 我们可以用一个简单的例子来说明这个过程。假设我们有一个外部文件,里面有三列数据,分别是员工编号、姓名和部门。我们想用SAS读入这个文件,并创建一个新的变量,表示员工的薪水。我们可以用下面的代码:
代码语言:javascript复制
data example;
infile 'external_file.txt';
input eno ename $ dept $;
salary = eno * 1000;
run;

在这个代码中,我们用infile语句指定了外部文件的位置,用input语句指定了变量的顺序和类型。我们还用一个赋值语句创建了一个新的变量salary,它是eno的1000倍。当我们运行这个代码时,SAS会先进行编译阶段,然后进行执行阶段。在编译阶段,SAS会做以下事情:

  • 检查语法是否正确
  • 创建一个输入缓存区,用于暂存外部文件的每一行数据
  • 创建一个程序数据向量(PDV),用于存储变量的当前值和一些自动生成的变量(如_N_和_ERROR_)
  • 创建描述性信息,用于记录变量的属性(如名字、长度、格式等) 在执行阶段,SAS会按照以下步骤循环处理每一行数据:
  • 从DATA语句开始,将_N_设为1,并在每次迭代后加1
  • 将PDV中的所有变量设为缺失值,并初始化自动变量
  • 用INPUT语句将一行数据从输入缓存区读入到PDV中
  • 执行赋值语句salary = eno * 1000;
  • 将PDV中的变量的当前值输出到新建的数据集中
  • 判断是否到达输入文件的结尾,如果是,则结束循环;如果否,则返回到DATA语句继续下一次迭代 我们可以用一个图示来展示输入缓存区和PDV在执行阶段的变化:

Input Buffer:

代码语言:javascript复制
          |10|Scott|Marketing|
          |20|John |Finance  |
          |30|Sam  |IT       |

PDV:

代码语言:javascript复制
 |eno|ename|dept    |salary|_N_|_ERROR_|
 |10 |Scott|Marketing|10000| 1 | 0     |
 |20 |John |Finance  |20000| 2 | 0     |
 |30 |Sam  |IT       |30000| 3 | 0     |

从图示中可以看出,输入缓存区只在读取外部文件时创建,它只用于暂存外部文件的每一行数据。而PDV在每个DATA步中都会创建,它用于存储变量的当前值和一些自动生成的变量。输入缓存区的内容是固定的,而PDV的内容会根据不同的语句进行更新和输出。输入缓存区的大小取决于外部文件的每行数据的长度,而PDV的大小取决于DATA步中涉及到的所有变量。SAS PDV有什么作用和好处?了解PDV对写SAS程序有很多作用和好处,比如:

  • 可以避免一些常见的错误,如变量的初始化、赋值和输出。例如,在DATA步中创建新变量时,需要注意新变量是否需要被RETAIN或SUM来保留其上次迭代时候得到值;否则,默认情况下新变量会被置为空值。
  • 可以优化程序的效率,如减少不必要的变量、语句和循环。例如,在DATA步中使用DROP或KEEP语句或选项来删除或保留不需要输出到新建数据集中去得变量;这样可以节省内存空间和运行时间。
  • 可以利用PDV中的自动变量,如_N_、_ERROR_、FIRST.、LAST.等,来实现一些复杂的逻辑和功能。例如,在DATA步中使用_N_来计数观测数;使用_ERROR_来检测错误;使用FIRST.和LAST.来处理分组数据。
  • 可以更好地理解SAS 的数据处理过程,如编译阶段和执行阶段 的区别和联系。例如,在编译阶段使用LENGTH或ATTRIB语句来指定变量 的长度;在执行阶段使用IF或WHERE语句来选择观测。

尊敬的读者,首先感谢您对本篇文章的关注和阅读。在此,本小编想要说明的是,以上所述内容都是经过笔者认真整理和撰写的,但限于个人能力和知识水平等因素,难免存在疏漏或错误之处。如有不当之处,敬请包涵并指正,本小编将虚心接受您的批评与建议,并严谨修正文章。再次感谢您对本篇文章的支持与厚爱。

以上就是今天的内容了,喜欢的话麻烦点个关注,非常感谢!!!

0 人点赞