在实际的应用中,我们会想查看当前观测的上一个观测值,在上一篇博客中我们使用了RETAIN语句来记录上一条观测,其实SAS还提供了一个很好用的函数LAG。当我们使用函数时,一定要明确该函数的返回值是什么。之前我一直认为LAG就是滞后一阶,返回当前观测的上一个值,实际上这种理解是错误的。

LAG返回的是上一次LAGE函数运行时的实参,即LAG(argument)=上一次LAG函数执行时的argument.

1. LAG函数

1.1 用LAG计算差值

DATA COMPARE;
INPUT X;
LAST_X = LAG(X);
DIFF_X = X - LAST_X;
DATALINES;
4
2
9
6
;
PROC PRINT DATA=COMPARE NOOBS;
TITLE "Demonstration the LAG Function";
RUN;

在这个例子中,LAG的确返回的是当前数据的上一个值,但是这只是表象,记住:LAG返回的是上一次LAGE函数运行时的实参,即LAG(argument)=上一次LAG函数执行时的argument。具体地,第一个X的值是4,但是在此之前LAG函数并没有执行过,那么它的实参当然是空,所以LAG(4)=.;接着X=2,上一次运行LAG时,LAG的实参是4,所以LAG(2)=4;接着X=9,上一次LAG运行时的实参是2,所以LAG(9)=2,依次类推。也许你觉得这两种理解对结果没有影响,那么我们来看看下一个例子:

DATA LAG2;
INPUT X;
IF X > 2 THEN LAG_X = LAG(X);
DATALINES;
1
3
.
5
2
7
;
PROC PRINT DATA=LAG2;
TITLE "Listing of LAG1 Data Set";
RUN;

注意,为什么LAG(3)是空呢,3的上一个值不是1吗,LAG(3)滞后一阶不是1吗?所以,记住:LAG返回的是上一次LAGE函数运行时的实参,即LAG(argument)=上一次LAG函数执行时的argument。在这个例子中,因为只用当X>2时才会调用LAG,所以第一次调用LAG时,X=3;当X=5时,第二次调用LAG,此时LAG(5)=3。

1.2 LAG2 LAG3等等

根据LAG可以推测出LAG2 LAG3的用法了:

DATA LAG_N;
INPUT X;
LAG_X = LAG(X);
LAG2_X = LAG2(X);
LAG3_X = LAG3(X);
DATALINES;
1
2
3
4
5
;
PROC PRINT DATA=LAG_N;
TITLE "Demonstrating the LAGn Family of Functions";
RUN;

2. DIFF函数

在没有判断语句的前提下,相当于一阶差分 DIF(X)=X-LAG(X)

DATA COMPARE;
INPUT X;
DIFF_X = DIF(X);
DATALINES;
4
2
9
6
;
PROC PRINT DATA=COMPARE NOOBS;
TITLE "Demonstration the DIF Function";
RUN;

SAS笔记(3) LAG和DIFF函数的更多相关文章

  1. ORACLE lag()与lead() 函数

    一.简介 lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤.这种 ...

  2. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  3. python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法

    python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法 在Python中字符串处理函数里有三个去空格(包括'\n', '\r', '\t', ' ')的函数 ...

  4. np.diff函数

    np.diff函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 数组中a[n]-a[n-1] import numpy as np a=np.array([1, 6, 7, 8, 12]) ...

  5. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  6. Flutter学习笔记(4)--Dart函数

    如需转载,请注明出处:Flutter学习笔记(4)--Dart函数 Dart是一个面向对象的语言,所以函数也是对象,函数属于Function对象,函数可以像参数一样传递给其他函数,这样便于做回调处理: ...

  7. 数据结构笔记2(c++)_跨函数使用内存的问题

    预备知识 1.所有的指针变量只占4个子节  用第一个字节的地址表示整个变量的地址 //1.cpp 所有的指针变量只占4个子节 用第一个字节的地址表示整个变量的地址 # include <stdi ...

  8. Objective-C学习笔记 利用协议实现回调函数

    来源:http://mobile.51cto.com/iphone-278354.htm Objective-C学习笔记 利用协议实现回调函数是本文要介绍的内容,主要是实现一个显示文字为测试的视图,然 ...

  9. pandas dataframe 时间字段 diff 函数

    pandas pandas 是数据处理的利器,非常方便进行表格数据处理,用过的人应该都很清楚,没接触的可以自行查阅pandas 官网. 需求介绍 最近在使用 pandas 的过程中碰到一个问题,需要计 ...

随机推荐

  1. linux 磁盘管理与文件系统

    一.磁盘分区的意义 磁盘分区就是为了将磁盘分成不同的逻辑区域,每个分区可以有不同的文件系统 二. 磁盘分区是按照磁盘的柱面进行分区的,由于盘片在转动时的角速度都是一样的,所以磁头在最外层的磁道上读取信 ...

  2. LSM Tree 学习笔记——MemTable通常用 SkipList 来实现

    最近发现很多数据库都使用了 LSM Tree 的存储模型,包括 LevelDB,HBase,Google BigTable,Cassandra,InfluxDB 等.之前还没有留意这么设计的原因,最近 ...

  3. java--Hibernate添加数据save

    添加按钮跳转到add表单页面 <a href="${pageContext.request.contextPath }/department_saveUI.action"&g ...

  4. IO流 相关基础积累

    一个整型32位字节. 写入到流.? 为什么要按十六进制输出到控制台?

  5. ffmpeg代码实现自定义encoder

    1.概述 本文主要讲述如何用ffmpeg代码实现自己的encoder. 2.代码 /* *本程序主要实现一个自己的encoder并加入到encoder链中去,供api调用 *作者:缪国凯(MK) *8 ...

  6. 11g RAC 如何备份OCR,利用备份恢复OCR,ocrdump

    OCR备份 OCR的备份有2种方式,自动备份和手工备份. 自动备份策略: Oracle Clusterware 每隔4小时,CRSD 进程会自动对OCR 进行一次备份,在任意时刻,oracle 总会保 ...

  7. [转]JS内存泄漏排查方法(Chrome Profiles)

    Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是其中一个.Heap Profiling可以记录当前的堆内存(heap)快照,并生成对象的描述文件,该描述文 ...

  8. HDOJ1015(简单深搜)

    Safecracker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. python的gzip库使用方法

    解压gzip文件示例: import gzip f = gzip.open('file.txt.gz', 'rb') file_content = f.read() f.close() 创建gzip文 ...

  10. 基于Docker部署私有npm

    NPM作为前端最cool及最烂的包管理器,它解决困扰前端工程化发展中代码模块管理的大问题.但是随着业务需求的发展,我们的代码从以前的单项目复用,延伸出了多项目复用的需求.本来项目之间代码复用管理的情景 ...