SAS笔记(2) RETAIN语句

本文重点:

  • 使用RETIAN,INPUT在每次循环执行时保留上一次PDV中的变量值。
  • SUM语句和SET语句会自动RETAIN变量。

1. RETAIN语句

1.1 Example 1

先来看看在DATA步不使用和使用RETAIN语句的差异

没有使用RETAIN:

DATA WITHOUT_1;PUT "Before the INPUT statement:  " _ALL_;INPUT X @@;PUT "After the INPUT statement:   " _ALL_ /;
DATALINES;
1 2 . 3
;

a1

使用RETAIN:

DATA WITH_1;RETAIN X;PUT "Before the INPUT statement:  " _ALL_;INPUT X @@;PUT "After the INPUT statement:   " _ALL_ /;
DATALINES;
1 2 . 3
;

a2

注意比较两段代码的输出红色矩形的内容,结合上一篇博客里讲的PDV,不难发现:

  • 不使用RETAIN,INPUT在每次循环执行时会把PDV中的变量值清空,即置为(.)。
  • 使用RETIAN,INPUT在每次循环执行时保留上一次PDV中的变量值。

实际上,上面这个例子里数据集WITHOUT_1和WITH_1的内容是一样的,下面来看一个必须要用RETAIN的例子。

1.2 Example 2

考虑这样一种场景:我们的数据集中有缺失值,我们想用该缺失值的前一个非缺失值来填补该缺失值,比如我们的数据是1,2,.,3填补后是1,2,2,3。
这在SAS中很好处理,我们只需要用一个变量记住上一个非缺失值即可:

DATA WITHOUT_2;PUT "Before INPUT:      " _ALL_ ;INPUT X @@;IF X NE . THEN OLD_X = X;ELSE X = OLD_X;PUT "After assignment:  " _ALL_ /;
DATALINES;
1 2 . 3
;

遗憾的是这段代码并没有实现我们的目的
a3
查看日志,问题就很明显了,因为没有使用RETAIN,所以在数据步的每一次循环开始时,PDV中的变量均被置空,所以OLD_X每一次都是空:

a4

既然想让OLD_X记住DATA步每次迭代的前一个值,我们RETAIN住OLD_X即可:

DATA WITH_2;RETAIN OLD_X;PUT "Before INPUT:      " _ALL_ ;INPUT X @@;IF X NE . THEN OLD_X = X;ELSE X = OLD_X;PUT "After assignment:  " _ALL_ /;
DATALINES;
1 2 . 3
;

a5

1.3 Example 3

考虑这样一种场景:在我们读入数据的时候,我们想给每个数据加一个顺序的行号,第一条观测是1,第二条观测是2,依次到最后一条观测。

下面用RETAIN语句实现:

DATA WITH_3;RETAIN SUBJECT 0;PUT "Before the INPUT statement: " _ALL_ ;INPUT X @@;SUBJECT = SUBJECT + 1;PUT "After the INPUT statement: " _ALL_ /;
DATALINES;
1 3 5
;

RETAIN SUBJECT 0;表示在DATA步的每一次迭代时RETAIN住SUBJECT这个变量,不要将其置为空,“0”表示SUBJECT的初始值。

上面这段代码,可以利用SAS中的SUM语句进行简化:

DATA WITHOUT_4;
PUT "Before the INPUT statement: " _ALL_ ;
INPUT X @@;
SUBJECT 
+ 1;
 /* SUM statement */ 
PUT "After the INPUT statement: " _ALL_ /;
DATALINES;
1 3 5
;

注意到SUM语句的作用:

  1. 不需要显示地用“=”赋值
  2. 不需要显示地初始化SUBJECT,它会自动初始化为0
  3. 不需要显示地RETAIN,它会自动RETAIN变量

其实,如果你还记得上一篇博客中我们在讲PDV时提到的自动变量_n_,这段代码可以更简洁:

DATA USE_n_;
PUT "Before the INPUT statement: " _ALL_ ;
INPUT X @@;
n
=
_n_; 
PUT "After the INPUT statement: " _ALL_ /;
DATALINES;
1 3 5
;

1.4 Example4

上一个例子中我们发现SUM语句会自动RETAIN变量,其实SAS中的SET语句也会自动RETAIN变量:

DATA ONE;INPUT X Y;
DATALINES;
1 2
;
DATA TWO;IF _N_ = 1 THEN SET ONE;PUT "Before INPUT statement: " _ALL_;INPUT NEW;PUT "After INPUT statement: " _ALL_ / ;
DATALINES;
3
4
5
;

a6

看一下日志,就发现SET的确自动RETAIN了变量X,Y。最开始,_N_=1,将X=1,Y=2读入,然后_N_=2,_N_=3等后面的每一步,粉色框里的X,Y值并没有在DATA步的每次迭代中被置空。

a7

 

参考资料:《Longitudinal Data and SAS: A Programmer's Guide》

转载于:https://www.cnblogs.com/zhangzhangwhu/p/7223163.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive优化策略

hive优化目标 在有限的资源下,运行效率高。常见问题 数据倾斜、Map数设置、Reduce数设置等 hive运行 查看运行计划 explain [extended] hql 例子 explain select no,count(*) from testudf group by no; explain extended select no,count(*) from testudf group …

POJ 3268 Silver Cow Party (最短路径)

POJ 3268 Silver Cow Party (最短路径) Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidi…

GPU性能实时监测的实用工具

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

条件随机场-应用

今天介绍CRFs在中文分词中的应用 工具:CRF,可以去 https://taku910.github.io/crfpp/ 下载,训练数据和测试数据可以考虑使用bakeoff2005,这是链接 http://sighan.cs.uchicago.edu/bakeoff2005/ 首先需要了解一些概念 字标记法——统计分词模型常用的方法…

Codeforces-808D Array Division (multiset 折半???)

题目链接: http://codeforces.com/problemset/problem/808/D 题意: 给定一个数列,移动0或1个数字,使数列能从某个位置分开前后两半的和相等。 思路: from: http://www.cnblogs.com/robin1998/p/6864278.html 我们可以假想有个隔板…

Linq中dbSet 的查询

1.Find:按照关键字的ID号来查询(速度快) 如: ADShiTi aDShiTi db.ADShiTis.Find(id); 2.FirstOrDefault:根据部分条件查询,显示最前的一条 如:按照daCID进行查找,有&#xff0c…

AJAX详解教程

AJAX(Asynchronous JavaScript And XML):异步的 JavaScript 和 XML。本身不是一种新技术,而是多个技术综合。用于快速创建动态网页的技术。一般的网页如果需要更新内容,必需重新加载个页面。而 AJAX通过浏览器与服务器进行少量数据交换&#…

JSON转换工具

JSON的处理: JSON(JavaScript Object Notation):是一种轻量级的数据交换格式。 它是基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅…

如何获取codeforces的完整数据

推荐: 如何获取codeforces的完整数据?(玄学方法) http://www.cnblogs.com/Saurus/p/6220513.html转载于:https://www.cnblogs.com/cmyg/p/7232386.html

Vue与Element入门使用

Vue: Vue是一套构建用户界面的渐进式前端框架。只关注视图层,并且非常容易学习,还可以很方便的与其它库或已有项目整合。通过尽可能简单的API来实现响应数据的绑定和组合的视图组件。视图:负责页面渲染,主要由HTMLCSS构…

nRF51822 配对之device_manager_init 调用,以及保证 用户数据存储 的Flash 操作不与device manager 模块冲突...

昨天 遇到了一个烦心的问题,被老外客户怼了两句,恼火,很想发火,发现英文不够用,算了,就不跟直肠的鬼佬一般见识。说正事。 最近的一个nRF51822MT2503 钱包防丢项目,准备接近量产了。昨天做APP的…

表单的ajax填入问题

又是表单 今天的表单是用事件委托从table里面获得eventId,用get请求从后台获得json数据填入表单中 第一个执行的比较顺利,但当再添加一个事件之后,修改(将数据填入表单)功能竟然失灵了,然后各种找原因&…

Redis基础-下载安装配置

Nosql: NoSQL:即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。 作用: 应对基于海量用户和海量数据前提下的数据处理问题。 特征: 可扩容,可伸缩大数据量下高性能…

R学习-- 数组和矩阵

生成 4行5列的数组,逐列逐行赋值x array(1:20, dim c(4,5))依据已知向量生成二维数组i array(c(1:3,3:1,4:6,5:7), dimc(3,4))也能够调整行列顺序 (3行4列变为4行3列)i array (c(1:3,3:1,4:6,7:9), dimc(4,3))数组a元素作为索引值操作数组…

PHP获取客户端ip的五种方式

方法一 1 <?php 2 $ip $_SERVER["REMOTE_ADDR"]; 3 echo $ip; 方法二 <?php $user_IP ($_SERVER["HTTP_VIA&qu…

Jedis使用

Jedis&#xff1a; Jedis是Redis官方推荐的Java连接服务工具。Java语言连接redis服务还有这些SpringData、Redis 、 Lettuce下载地址&#xff1a;https://mvnrepository.com/artifact/redis.clients/jedisAPI文档&#xff1a;http://xetorthio.github.io/jedis/ 连接练习&#…

Centos6.6升级python2到python3

系统更新部分&#xff1a; 一、由于系统原有的源无法连接&#xff0c;需要更新为新的源。起初&#xff0c;首选163的源&#xff0c;但是由于更改源以后&#xff0c;无法使用yum等问题&#xff0c;所以直接使用上海交通大学提供的源。 修改前&#xff0c;将原来/etc/yum.repos.d…

转:20分钟教你使用hexo搭建github博客

注册Github账号 这里我们就不多讲了&#xff0c;小伙伴们可以点击这里&#xff0c;进入官网进行注册。 创建仓库 图片来自Github登录账号后&#xff0c;在Github页面的右上方选择New repository进行仓库的创建。 图片来自Github在仓库名字输入框中输入&#xff1a; Github昵称.…

Maven入门详解与安装配置

Maven&#xff1a; Maven出现前的问题&#xff1a; 假设你现在做了一个项目&#xff0c;项目中肯定要用到一些jar包&#xff0c;比如说mybatis&#xff0c;log4j&#xff0c;JUnit等&#xff0c;除了这些之外&#xff0c;你有可能用到你的同事开发的其他的东西&#xff0c;比如…

前台打断点

很简单&#xff1a; 1.按F12 2.点击Sources 3.打开你要进行的js文件&#xff08;&#xff09; 4.点击你要运行的方法 5.触发按钮点击 6.排除&#xff08;触发按钮点击之后有两个按钮和半透明的&#xff09; 7.半透明的第一个按钮是过程一个断点直接跳到另一个断点 8.半透明的第…