Swati Agarwal,OPTUM,Eden Prairie,MN
空谷幽兰 翻译 sxlion 校对 原文链接
译言:SAS DATA步对于SAS入门学习者来说是个难以理解的东西,因为SAS封装了一些过程,这种封装对于有语言基础的人来说反而是一个障碍。本文非常详细的解释了SAS 数据的编译、执行过程,对于了解SAS的基本运行有很大帮助。不管SAS老鸟,新鸟,相信你都会有收获,因为这篇文章是难得的如此系统 !
摘要
每个SAS数据步(SAS Data step,以后写成简写“DATA步”)在整个SAS程序中编译和执行过程中。大量DATA步的处理过程都是非明示的(即隐藏不可见)。例如,尽管程序中没有使用循环控制语句不包含循环,但DATA步都像一个自封装的小程序以一种非明示的循环形式执行。
这篇文章探讨了一些非明示的DATA处理过程怎么控制你的DATA步实际运行的。
需要提前说明的概念:
你或许在程序中写过大量的DATA步:一些能运行,一些则运行不了。有时候你知道为什么;有时你不知道为什么,甚至你冥思苦想而百思不得其解。如果碰到过这些问题,那么这篇文章很适合你。
Data步设计的非常好,但是有些另类。如果你想写出很漂亮的代码,就很有必要知道DATA步的工作原理。读完这篇文章以后,“哦,哦,… 原来如此!”,一个即使使用SAS多年的老鸟,也会发出这样的感叹。 from http://saslist.net
引言
DATA步是建SAS数据集的主要方法之一。要想成为一个优秀的SAS程序员很有必要理解DATA步的各个环节,主要是因为一些涉及数据处理和创建数据集的任务可能只能通过DATA步才能解决(这些任务不能通过SAS过程步(SAS procedures,以后简写成“SAS过程步”)解决、或者使用SAS过程步太过复杂而难以使用)。
了解DATA步的生命周期非常重要,它分为编译和执行两个阶段。同时学习PDV也非常重要。PDV贯穿SAS的编译和执行两个阶段,而且能决定了信息在DATA步中的存储及变化。
编译阶段包括:
执行阶段包括:
PDV贯穿编译和执行阶段:
如果你已经了解控制DATA步处理过程的这些重要概念,那么你就能控制DATA步,来指挥SAS根据自己的意愿来工作和初始化自动变量。
DATA 步
一个DATA步包含SAS语言中的一组语句,这些语句具有以下功能:
一旦数据可以以SAS数据集的形式访问,你就可以通过SAS过程步来分析数据和写报告。
可以运用DATA步:
DATA步以“DATA”语句开始(即显示的表明数据步的开始),以“RUN”语句结束,在结束时会编译或执行RUN语句。在数据步最后一个观察值读取前,“RUN”的功能都是以非显示的形式执行RETURN功能,去继续循环的操作。from http://saslist.net
DATA步的生命周期图
SAS提供了下面的流程图来描述DATA步的处理过程。
图1 DATA步的动作流程图
编译阶段
如上所述,DATA步的第一个阶段就为编译阶段。在编译阶段SAS的任务如下:
例1:语法错误检查
RROR 386-185: Expecting an arithmetic expression. /*期望一个数学公式*/
ERROR 200-322: The symbol is not recognized and will be ignored. /*符号不被识别,忽略*/
执行阶段
把SAS代码编译成机器代码后,输入缓存区,PDV和描述性信息。执行阶段进入重要阶段,SAS将按照默认的顺序执行以下功能:
例2:默认和强制情况下的顺序
第一个例子是一个简单的DATA步,它遵循语句的标准执行过程并输出数据记录。这个例子中,一个迭代过程产生了一个观测:
第二个例子展现了数据步的一个迭代过程如何生成5条观测。DO LOOP循环改变了执行的默认顺序。
PDV(Program Data Vector)
在SAS参考教程中将PDV定义为:“PDV是内存中用来创建数据集的逻辑区域,每次只涉及一条观测值。当程序执行时,SAS从输入缓存区中读入数值或通过执行SAS语句创建数值。数据值赋给PDV中一个合适的变量。SAS将该数值作为一条观测值写入SAS数据集。”
换句话说:PDV(Program Data Vector)是内存中的一个存储空间,包含了DATA步涉及的所有变量。变量出现的顺序决定了在他们在PDV中的顺序。每个变量可能会有一个标记,用于指示他们是被保留(Keep)、舍弃(Drop)或是改名(Rename)。当程序运行时,PDV包含的观测值被处理。在结束时,数据根据程序中的DROP、KEEP或RENAME标识被输出。
输入缓存区创建完成后,PDV也随即创建完成。PDV是内存中创建数据集的地方,一次仅创建一个观测。像术语输入缓存区(Input buffer)一样,PDV也只是一个逻辑概念。
PDV
临时变量(Temporary variables)可以通过SAS选项和语句来创建,和自动变量一样,临时变量也不会输出到数据集。一些临时变量包括:
如果需要把临时变量和自动变量的值输出到数据集,则需要把临时变量或自动变量的值赋给用户定义的变量。
PDV存储数据集中的、input 涉及的或data步执行过程中创建的所有变量,包括用户自定义、自动和临时的变量。PDV被用来填充输出数据集。输出数据集中的所有变量都在PDV(Program Data Vector)中,但并不是PDV(Program Data Vector)中的所有变量都输出到最终数据集。
SAS执行过程中,在DATA步迭代之初都会把PDV(Program Data Vector)中非保留和非输入变量设为缺失值。SAS从输入文件或一个SAS数据集读入数据到PDV(Program Data Vector)中,同时会替掉以前存在的值。 from http://saslist.net
DATA步处理过程:系统介绍
编译阶段PDV的设置如下:
在DATA步结尾,PDV执行结果如下:
例1中有一条观测输出。DATA步只进行了一次迭代。除了_N_和_ERROR_两个变量,数据集中包括剩下的所有变量。
由于这个例子包含了原数据input文件。SAS在把这些数据发送到PDV之前先创建内存缓冲区来存储数据。
注意:如果输入文件是一个SAS数据集,SAS就不会在创建内存缓冲区。SAS会把数据直接传送到PDV。
内存缓冲区input buffer
PDV
注意,在上面表格中,数值变量和字符变量分别被初始化为点和空格。自动变量_N_的初始为1;自动变量_ERROR_的初值为0.
读入第一条观测后,PDV如下所示:
当SAS执行DATA步最后一条语句时,除了被标记为drop的变量,PDV中剩余的所有值将作为一个观测输出到数据集TOTAL_POINTS。
接着SAS会回到DATA步开头进行下一轮迭代。SAS按照下面的方式重设PDV中的值。
下表展示了每条记录被写入例2数据集之前在PDV中的存在形式。应该牢记:PDV每次只存一条观测,而且在新数据存入之前把原数据写入到输出数据集中。
总结
可视化PDV对理解DATA步的执行过程非常有帮助。对于简单的DATA步来说似乎没有必要,但是这样做对理解DATA步很有益。如果你在某种程度上理解了一个数据集的读入和输出,那么你不至于写出类似下面这个的多个DATA步。
既然数据集PERM.A中的每个观测都被复制到PDV中,那么为什么不同时创建X变量呢?
当你想做复杂的事情时,你需要非常具体而不是模糊地知道关于PDV中存储的信息和SAS处理这些信息的规则。当你的程序没有按照你的意愿执行,通过PUT语句或DATA步将PDV中的部分信息输出到日志查看。 from http://saslist.net
致谢 非常感谢Thank Saiful和Steve Roloff,他们矫正了这篇文字并且提出了建议而且给我以鼓励。我也非常感谢Andrew,他在这篇文章完成时给予有价值的反馈。
RECOMMENDED READING /*推荐阅读*/
Arthur Li (2013), “Essentials of the Program Data Vector (PDV): Directing the Aim to Understanding the DATA Step!”, Proceedings of the 2013 SAS® Global Forum
Whitlock, Ian, “How to Think Through the SAS® DATA Step”, Proceedings of the 31st Annual SAS® Users Group International Conference
Kahane, Dalia C (2011), “SAS® DATA Step Merge – A Powerful Tool”, Proceedings of the 2011 North East SAS® Users Group Conference
SAS® 9.1.3 Language Reference: Concepts, Third Edition. 2005, SAS® Institute Inc., Cary, NC, USA
CONTACT INFORMATION /*联系信息*/Name: Swati Agarwal Enterprise: Optum
Address: 12982 Valley View Road City, State ZIP: Eden Prairie, MN, 55344 Work Phone: 952-974-1932
E-mail: mailtoswatiagarwal@yahoo.com
原创文章: ”SAS DATA步之全解密“,转载请注明: 转自SAS资源资讯列表
本文链接地址: http://saslist.net/archives/356
Leave a Comment