前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS PDV:程序数据向量的秘密[返璞归真004]

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

作者头像
归海刀刀
发布2023-10-09 12:59:42
4060
发布2023-10-09 12:59:42
举报
文章被收录于专栏:归海刀刀归海刀刀
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语句来选择观测。

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 归海刀刀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档