Chapter002[SAS DATA步之全解密-01]
以下是个人对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"; |
在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); |
)
回到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]相关推荐
- 从程序员到数据科学家:SAS 编程基础 (06)- DATA步与PDV
在BASE SAS 中,DATA 语句用于开始一个数据步, 后续为若干DATA步特定的语句:SAS数据步结束于下一个 DATA 步或 PROC 步开始之处,或者结束于后续显式指定的RUN语句. 注意: ...
- SAS学习笔记之《SAS编程与数据挖掘商业案例》(4)DATA步循环与控制、常用全程语句、输出控制...
SAS学习笔记之<SAS编程与数据挖掘商业案例>(4)DATA步循环与控制.常用全程语句.输出控制 1. 各种循环与控制 DO组 创建一个执行语句块 DO循环 根据下标变量重复执行DO和E ...
- SAS(八)SAS之DATA步--文件操作语句
SAS(八)DATA步 绝大部分的SAS语句都可分为两步:DATA步(打开.编辑.整理数据)和PROC步(分析.处理.显示数据)组成的,今天我们来学习DATA步相关知识点. DATA步主要是运用到以下 ...
- python读取sas数据集_SAS之DATA步运行机制
相信了解SAS软件的朋友都知道,SAS主要由DATA步和PROC步组成,其中DATA步作为数据读入.清洗.整理的主要程序步,学好DATA就显得尤为重要.而了解DATA步,重中之重就得了解PDV(Log ...
- SAS数据步与过程步,数据步语句
SAS数据步与过程步,数据步语句 http://www.biostatistic.net/thread-2045-1-1.html ---转载---原文作者:biostar (出处: 生物统计家园) ...
- sas Data步数据读取流程详解
data me; put _n_= x=;/*******1******/ input x/*input这里是读入缓冲流的关键步骤变量是从缓冲流中取出数据,根据缓冲流中指针的位置来获取变量信息*/; ...
- 【原创】植物大战僵尸全解密---存档篇
2010-04-13 更新了一点,尽量把demo做成program 2010-04-12 原来的程序在删除用户时,没有删除对应用户的游戏进度.现在修正 另外告诉大家一个关于游戏的小密秘.在帖子的最后. ...
- 植物大战僵尸全解密---存档篇[转]学习内存读写的方法
标 题: [原创]植物大战僵尸全解密---存档篇 作 者: cntrump 时 间: 2010-04-11,21:44:09 链 接: http://bbs.pediy.com/showthread. ...
- SAS过程步常用语句
一.print过程 print过程可以打印一个SAS数据集中的全体或部分观测值,还可以打印数 值变量的综合或部分和. print过程中经常使用的语句有: proc print [选择项]; var 变 ...
最新文章
- 匿名函数应用-多线程测试代码
- linux+用户的shell,Linux用户管理(十)Linux Shell高级
- 单击CheckBox,全选GridView中所有CheckBox
- Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
- 我的开源 GitBook: Python 之旅
- vue 鼠标点击事件_VBA代码解决方案第115讲:点击鼠标实现精准控制触发事件的VBA代码第二方案...
- java 线程由浅入深_Java多线程:由浅入深看synchronized的底层实现原理
- 蓝桥杯(java)基础练习 龟兔赛跑
- Listview的OnScrollListener的滑动监听实现分页加载
- Unity变量命名的6个重要提示
- MySQL内核月报 2014.09-MySQL· 捉虫动态·auto_increment
- information_schema系列五(表,触发器,视图,存储过程和函数)
- eclipse中maven项目pom文件第一行报错解决方法
- isis协议_ISIS与OSPF之间有什么差异?
- Redis,唯快不破!
- HDU-1042 N!
- VC2012 学习记录
- 关于Winxp U盘无法复制磁盘写保护解决方法
- 一个人越想挣钱,越挣不到钱!背后的原因是什么?
- 传奇GEE引擎版本架设
热门文章
- CyberLink YouCam Deluxe 4.0.913 With Serial Key.torrent
- 感性,有时候是阻碍我们进步的最大障碍
- php中加入 空格的代码,在HTML中插入空格的几种方法
- Gaint 自行车知识及价格表
- 【学习报告】22.9.24-22.9.26
- linux如何运行windows游戏,Steam 让我们在 Linux 上玩 Windows 的游戏更加容易
- 用tutle库绘制阴阳图案
- HTML(基于Java开发的学习)
- 苹果MacBook Air 2022款 评测
- 其实,家家都有本难念的经