SAS DATA步之全解密
SAS DATA步对于SAS入门学习者来说是个难以理解的东西,因为SAS封装了一些过程,这种封装对于有语言基础的人来说反而是一个障碍。本文非常详细的解释了SAS 数据的编译、执行过程,对于了解SAS的基本运行有很大帮助。不管SAS老鸟,新鸟,相信你都会有收获,因为这篇文章是难得的如此系统 !
摘要
每个SAS数据步(SAS Data step,以后写成简写“DATA步”)在整个SAS程序中编译和执行过程中。大量DATA步的处理过程都是非明示的(即隐藏不可见)。例如,尽管程序中没有使用循环控制语句不包含循环,但DATA步都像一个自封装的小程序以一种非明示的循环形式执行。
这篇文章探讨了一些非明示的DATA处理过程怎么控制你的DATA步实际运行的。
需要提前说明的概念:
程序数据向量(Logical Program Data Vector简写成PDV,台湾地区翻译成“程式资料向量”)
SAS自动变量名及其使用
理解data步的内部处理过程
代码编译期间发生的事情
程序执行期间实际发生了什么
如何获取和存储变量属性
你或许在程序中写过大量的DATA步:一些能运行,一些则运行不了。有时候你知道为什么;有时你不知道为什么,甚至你冥思苦想而百思不得其解。如果碰到过这些问题,那么这篇文章很适合你。
Data步设计的非常好,但是有些另类。如果你想写出很漂亮的代码,就很有必要知道DATA步的工作原理。读完这篇文章以后,“哦,哦,… 原来如此!”,一个即使使用SAS多年的老鸟,也会发出这样的感叹。
引言
DATA步是建SAS数据集的主要方法之一。要想成为一个优秀的SAS程序员很有必要理解DATA步的各个环节,主要是因为一些涉及数据处理和创建数据集的任务可能只能通过DATA步才能解决(这些任务不能通过SAS过程步(SAS procedures,以后简写成“SAS过程步”)解决、或者使用SAS过程步太过复杂而难以使用)。
了解DATA步的生命周期非常重要,它分为编译和执行两个阶段。同时学习PDV也非常重要。PDV贯穿SAS的编译和执行两个阶段,而且能决定了信息在DATA步中的存储及变化。
编译阶段包括:
编译SAS语句,包括检查语法
创建一个输入缓存区(input buffer)(如果需要读入原始数据文件)、一个PDV和描述性信息
执行阶段包括:
计算Data步迭代的次数(从Data语句开始)
将PDV中的所有变量设成缺失值并初始化自动变量
读取输入观测(从原始文件或SAS数据集)
执行附加的处理或计算语句
将一条数据记录写入输出数据集并返回到DATA步语句
PDV贯穿编译和执行阶段:
PDV是内存中的一个临时逻辑区域,SAS建立数据集时,每条观察值只有一次机会用到PDV。
包含所有变量的当前值
包含两个自动变量:_N_和_ERROR_
如果你已经了解控制DATA步处理过程的这些重要概念,那么你就能控制DATA步,来指挥SAS根据自己的意愿来工作和初始化自动变量。
DATA 步
一个DATA步包含SAS语言中的一组语句,这些语句具有以下功能:
从外部文件读入数据
将数据写入外部文件
读入SAS数据集和SAS视图
创建SAS数据集和SAS视图
一旦数据可以以SAS数据集的形式访问,你就可以通过SAS过程步来分析数据和写报告。
可以运用DATA步:
创建SAS数据集(SAS数据集或SAS视图)
根据包含原始数据(外部文件)的文件创建SAS数据集
通过提取子集、合并、修改和更新已经存在数据集的方式来创建新的数据集
分析、处理或展现数据
为新变量赋值 (译者注:有公式计算的情况下)
撰写报告或将文件写入磁盘或磁带
信息检索
文件管理
DATA步以“DATA”语句开始(即显示的表明数据步的开始),以“RUN”语句结束,在结束时会编译或执行RUN语句。在数据步最后一个观察值读取前,“RUN”的功能都是以非显示的形式执行RETURN功能,去继续循环的操作。
DATA步的生命周期图
SAS提供了下面的流程图来描述DATA步的处理过程。
From “The Secret Life of DATA STEP” translated by sxlion
图1 DATA步的动作流程图
编译阶段
如上所述,DATA步的第一个阶段就为编译阶段。在编译阶段SAS的任务如下:
自动将SAS语句编译成将会在后面执行的机器语言
确定每个变量的类型和长度
确定变量是否有必要进行类型转换
如果有INPUT语句,为外部文件新建读取内存缓存区
创建PDV(Program Data Vector)
创建数据集和变量属性的描述性信息
处理语句,该项任务仅限于编译阶段;这为编译器如何新建变量提供信息;事实上,它们决定了如何在PDV内建立变量及信息;这些信息包括:DROP;KEEP;RENAME;RETAIN;WHERE;LABEL;LENGTH;FORMAT;ARRAY;BY;ATTRIB
创建自动变量;包括_N_,_ERROR_,END=,IN=,FIRST,LAST,POINT=
例1:语法错误检查
1 data example_1;
2 x = ||Hi= ;
–
386
200
3 y = ||How=;
–
386
200
4 y = ||Your=;
–
386
200
5 y = ||Day=;
–
386
200
RROR 386-185: Expecting an arithmetic expression. /*期望一个数学公式*/
ERROR 200-322: The symbol is not recognized and will be ignored. /*符号不被识别,忽略*/
6 run; /*代码6 运行*/
执行阶段
把SAS代码编译成机器代码后,输入缓存区,PDV和描述性信息。执行阶段进入重要阶段,SAS将按照默认的顺序执行以下功能:
从DATA语句开始,将_N_值设定为1(随着DATA语句的每次迭代,变量_N_自动加1)
把PDV(Program Data Vecctor)中的变量设为missing
用Input语句把一条数据记录读入缓存区(如果读入的是原始文件)
用SET,MERGE,MODIFY或UPDATE语句,把SAS数据集里的一条观测值读入到PDV
执行DATA步中存在的程序语句
将一条观测写入输出数据集,碰到语句data _NULL_的情况除外,即无需写入数据
一个迭代结束,返回到DATA语句的开始
每个迭代过程都循环进行直到达到输入文件(或输入数据集)结尾
如果DATA步没有读入任何记录,执行(默认情况)行为只进行一次
可以通过条件语句IF-THEN-ELSE、DO Loops、LINK,RETURN和GO TO等语句改变执行的默认顺序
例2:默认和强制情况下的顺序
第一个例子是一个简单的DATA步,它遵循语句的标准执行过程并输出数据记录。这个例子中,一个迭代过程产生了一个观测:
data example_2;
x = ‘Minnesota’;
y = ‘Columbus’;
run;
The log presents the following message: /*日志输出如下信息*/
NOTE: The data set WORK.EXAMPLE_2 has 1 observation and 2 variables.
第二个例子展现了数据步的一个迭代过程如何生成5条观测。DO LOOP循环改变了执行的默认顺序。
data example_3;
do i = 1 to 5;
x = ‘Minnesota’;
y = ‘Columbus’;
output;
end;
run;
The log presents the following message
NOTE: The data set WORK.EXAMPLE_2 has 5 observations and 3 variables.
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(Program Data Vector)中包含两个自动变量供数据步使用,但是这两个自动变量并不会作为观测的一部分输出到数据集。
_N_对DATA步开始执行后的迭代次数进行计数
_ERROR_表示在数据步执行期间有错误发生。_ERROR_的默认值为0,表示程序没有错误。当程序中出现一个或多个错误时,_ERROR_的值变为1。
变量First.By-variance和变量Last.By-variance:这两个临时变量总是成对出现,By语句中的每一个By变量都对应着一对临时变量。当他们的条件为真或假时分别相应的赋值为1或0。
PDV
临时变量(Temporary variables)可以通过SAS选项和语句来创建,和自动变量一样,临时变量也不会输出到数据集。一些临时变量包括:
选项IN=变量:IN=是数据集的一个选项,表示一个特定数据集是否贡献了当前观察值。程序员可以用该选项指定一个变量名,当观测在数据集中时变量值为1否则为0。
END=变量名:END=是SET语句的一个选项表示已经达到输入数据集的结尾。如果达到文件的结尾,程序员通过指定一个变量名,当数据达到最后一个时,该变量被赋值1,否则为0。一个SET语句只能设一个END=选项。如果SET语句后有多个数据集,只有达到最后一个数据集的最后一条观测值时,该变量的值才为1。
如果需要把临时变量和自动变量的值输出到数据集,则需要把临时变量或自动变量的值赋给用户定义的变量。
PDV存储数据集中的、input 涉及的或data步执行过程中创建的所有变量,包括用户自定义、自动和临时的变量。PDV被用来填充输出数据集。输出数据集中的所有变量都在PDV(Program Data Vector)中,但并不是PDV(Program Data Vector)中的所有变量都输出到最终数据集。
SAS执行过程中,在DATA步迭代之初都会把PDV(Program Data Vector)中非保留和非输入变量设为缺失值。SAS从输入文件或一个SAS数据集读入数据到PDV(Program Data Vector)中,同时会替掉以前存在的值。
DATA步处理过程:系统介绍
Example 4 – simple default – no reading of input data /*简单默认-没有读入input数据*/
data example_4;
put “after compile before execution: ” _all_;
x = “GOOD”;
y = “MORNING”;
z = “COLUMBUS”;
n = 4;
k = n*2;
put “at end of execution: ” _all_;
run;
编译阶段PDV的设置如下:
在DATA步结尾,PDV执行结果如下:
例1中有一条观测输出。DATA步只进行了一次迭代。除了_N_和_ERROR_两个变量,数据集中包括剩下的所有变量。
Example 5 – reading of raw input data /*读取原始input数据*/
data total_points (drop=Class);
input class $ StudentName $ Subject1 Subject2 Subject3;
Total = (Subject1 + Subject2 + Subject3);
datalines;
Knights Sue 6 8 8
Kings Jane 9 7 8
Knights John 7 7 7
Knights Lisa 8 9 9
Knights Fran 7 6 6
Knights Walter 9 8 10
;
Run;
由于这个例子包含了原数据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中的值。
INPUT语句创建的变量值被设为缺失值。
累加语句创建的值自动保留。
Retain语句中的变量值自动保留 /* 原文无,sxlion补充*/
自动变量_N_的值自动加1,_ERROR_的值重设为0。
下表展示了每条记录被写入例2数据集之前在PDV中的存在形式。应该牢记:PDV每次只存一条观测,而且在新数据存入之前把原数据写入到输出数据集中。
总结
可视化PDV对理解DATA步的执行过程非常有帮助。对于简单的DATA步来说似乎没有必要,但是这样做对理解DATA步很有益。如果你在某种程度上理解了一个数据集的读入和输出,那么你不至于写出类似下面这个的多个DATA步。数据分析师培训
data a;
set perm.a ;
data b;
set a ;
x = y + 2;
既然数据集PERM.A中的每个观测都被复制到PDV中,那么为什么不同时创建X变量呢?
当你想做复杂的事情时,你需要非常具体而不是模糊地知道关于PDV中存储的信息和SAS处理这些信息的规则。当你的程序没有按照你的意愿执行,通过PUT语句或DATA步将PDV中的部分信息输出到日志查看。
数据分析咨询请扫描二维码
在准备数据分析师面试时,掌握高频考题及其解答是应对面试的关键。为了帮助大家轻松上岸,以下是10个高频考题及其详细解析,外加 ...
2024-12-20互联网数据分析师是一个热门且综合性的职业,他们通过数据挖掘和分析,为企业的业务决策和运营优化提供强有力的支持。尤其在如今 ...
2024-12-20在现代商业环境中,数据分析师是不可或缺的角色。他们的工作不仅仅是对数据进行深入分析,更是协助企业从复杂的数据信息中提炼出 ...
2024-12-20随着大数据时代的到来,数据驱动的决策方式开始受到越来越多企业的青睐。近年来,数据分析在人力资源管理中正在扮演着至关重要的 ...
2024-12-20在数据分析的世界里,表面上的技术操作只是“入门票”,而真正的高手则需要打破一些“看不见的墙”。这些“隐形天花板”限制了数 ...
2024-12-19在数据分析领域,尽管行业前景广阔、岗位需求旺盛,但实际的工作难度却远超很多人的想象。很多新手初入数据分析岗位时,常常被各 ...
2024-12-19入门数据分析,许多人都会感到“难”,但这“难”究竟难在哪儿?对于新手而言,往往不是技术不行,而是思维方式、业务理解和实践 ...
2024-12-19在如今的行业动荡背景下,数据分析师的职业前景虽然面临一些挑战,但也充满了许多新的机会。随着技术的不断发展和多领域需求的提 ...
2024-12-19在信息爆炸的时代,数据分析师如同探险家,在浩瀚的数据海洋中寻觅有价值的宝藏。这不仅需要技术上的过硬实力,还需要一种艺术家 ...
2024-12-19在当今信息化社会,大数据已成为各行各业不可或缺的宝贵资源。大数据专业应运而生,旨在培养具备扎实理论基础和实践能力,能够应 ...
2024-12-19阿里P8、P9失业都找不到工作?是我们孤陋寡闻还是世界真的已经“癫”成这样了? 案例一:本硕都是 985,所学的专业也是当红专业 ...
2024-12-19CDA持证人Louis CDA持证人基本情况 我大学是在一个二线城市的一所普通二本院校读的,专业是旅游管理,非计算机非统计学。毕业之 ...
2024-12-18最近,知乎上有个很火的话题:“一个人为何会陷入社会底层”? 有人说,这个世界上只有一个分水岭,就是“羊水”;还有人说,一 ...
2024-12-18在这个数据驱动的时代,数据分析师的技能需求快速增长。掌握适当的编程语言不仅能增强分析能力,还能帮助分析师从海量数据中提取 ...
2024-12-17在当今信息爆炸的时代,数据分析已经成为许多行业中不可或缺的一部分。想要在这个领域脱颖而出,除了热情和毅力外,你还需要掌握 ...
2024-12-17数据分析,是一项通过科学方法处理数据以获取洞察并支持决策的艺术。无论是在商业环境中提升业绩,还是在科研领域推动创新,数据 ...
2024-12-17在数据分析领域,图表是我们表达数据故事的重要工具。它们不仅让数据变得更加直观,也帮助我们更好地理解数据中的趋势和模式。相 ...
2024-12-16在当今社会,我们身处着一个飞速发展、变化迅猛的时代。不同行业在科技进步、市场需求和政策支持的推动下蓬勃发展,呈现出令人瞩 ...
2024-12-16在现代商业世界中,数据分析师扮演着至关重要的角色。他们通过解析海量数据,为企业战略决策提供有力支持。要有效完成这项任务, ...
2024-12-16在当今数据爆炸的时代,数据分析师是组织中不可或缺的导航者。他们通过从大量数据中提取可操作的洞察力,帮助企业在竞争激烈的市 ...
2024-12-16