SAS笔记(4) FIRST.和LAST.临时变量

FIRST.和LAST.临时变量是SAS很有特色的一点,我在R和Python中暂时没有发现类似的功能(也许它们也有这个功能,我不知道而已)。考虑这样一种场景:我们有患者就诊的数据,每一条观测对应一个患者的一次就诊记录,我们知道一个患者可能会多次就医,那么如何找到这个患者第一次就医时间以及最有一次就医时间呢?又或者我们如何确定一个患者是不是因为同一个疾病多次入院。这篇博文将详细介绍如何利用FIRST.和LAST.这两个临时变量解决类似问题。

1.创建FIRST.和LAST.临时变量

  1. 创建FIRST.和LAST.变量的前提是数据必须是排好序的。利用SORT排序,BY var。
  2. 使用SET复制已排好序的数据,用BY语句创建FIRST.和LAST.,BY的对象是第一步排序的变量 var。
***创建数据
DATA ONE;
   INPUT SUBJECT SCORE;
DATALINES;
1 11
2 21
3 31
1 12
4 41
1 13
2 22
4 42
4 43
;

***1.对数据进行排序
PROC SORT DATA=ONE;
BY SUBJECT;
RUN;

***2.创建FIRST. 和LAST. 临时变量
DATA TWO;
   SET ONE;
   BY SUBJECT;
   FIRST = FIRST.SUBJECT;
   LAST = LAST.SUBJECT;
RUN;

PROC PRINT DATA=TWO;
   TITLE "Demonstrating FIRST. and LAST. Variables";
RUN;

我们发现,对于第3个subject,他的FIRST.和LAST.都为1,说明这个患者只去过一次医院。这里需要注意的是,对于BY语句后面的每一个变量,都会有一个对应的FIRST.和LAST.临时变量,并且这些临时变量不会输出在数据集中。

2. 使用多个BY 变量

DATA THREE;
   INFORMAT GENDER GROUP $1.;
   INPUT GENDER GROUP SCORE;
DATALINES;
M A 23
M A 24
M B 33
M B 35
M B 36
F A 41
F A 42
F A 43
F B 51
;
PROC SORT DATA=THREE;
   BY GENDER GROUP;
RUN;

DATA FOUR;
   SET THREE;
   BY GENDER GROUP;
   FIRST_GENDER = FIRST.GENDER;
   LAST_GENDER = LAST.GENDER;
   FIRST_GROUP = FIRST.GROUP;
   LAST_GROUP = LAST.GROUP;

PROC PRINT DATA=FOUR;
   TITLE "Listing of Data Set FOUR";
RUN;

3. 应用

用FIRST.和LAST.计算每个患者的就医次数

PROC SORT DATA=ONE;
   BY SUBJECT;
RUN;

DATA COUNT;
   SET ONE;
   BY SUBJECT;

   IF FIRST.SUBJECT THEN NUMBER = 0;
   NUMBER + 1;

   IF LAST.SUBJECT THEN OUTPUT;
   KEEP SUBJECT NUMBER;
RUN;
 
***将每个患者的就医次数放入原始数据DATA COMBINE;   MERGE ONE COUNT;   BY SUBJECT;RUN;

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

时间: 2024-12-19 09:23:19

SAS笔记(4) FIRST.和LAST.临时变量的相关文章

重构笔记——分解临时变量

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42463871         在上一篇文章中介绍了"重构笔记--引入解释性变量".本文将介绍"分解临时变量"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:你的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果. 解决:针对每次赋值,创造一个独立.对应的

重构笔记——内联临时变量

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42167015         在上一篇文章中介绍了" 内联函数".本文将介绍"内联临时变量"这种重构手法.         下面让我们一起来学习该重构手法把.(PS:虽然某些重构手法看起很简单,但是和其它重构手法结合起来使用,会产生异曲同工的效果) 开门见山         发现:你有一个临时变量,只被一个简单表达式赋

以查询取代临时变量

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42386305         在上一篇文章中介绍了" 内联临时变量".本文将介绍"以查询取代临时变量"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:你的程序以一个临时变量保存某一表达式的运算结果. 解决:将这个表达式提炼到一个独立函数中.将这个临时变量的所有引用点替换为对新函

代码重构之以查询取代临时变量

意图 - 使得同一个类中的所有函数都可以获得这份信息,能够为这个类编写更清晰的代码 示例 /** * 以查询取代临时变量之前 * Created by luo on 2017/4/19. */ public class ReplaceTempWithQueryBefore { private double _quantity; private double _itemPrice; public double test() { double basePrice = _quantity * _ite

python学习笔记2—python文件类型、变量、数值、字符串、元组、列表、字典

python学习笔记2--python文件类型.变量.数值.字符串.元组.列表.字典 一.Python文件类型 1.源代码 python源代码文件以.py为扩展名,由pyton程序解释,不需要编译 [[email protected] day01]# vim 1.py #!/usr/bin/python        print 'hello world!' [[email protected] day01]# python 1.py hello world! 2.字节代码 Python源码文件

重构改善既有代码设计--重构手法04:Replace Temp with Query (以查询取代临时变量)

所谓的以查询取代临时变量:就是当你的程序以一个临时变量保存某一个表达式的运算效果.将这个表达式提炼到一个独立函数中.将这个临时变量的所有引用点替换为对新函数的调用.此后,新函数就可以被其他函数调用. 例子如下: double basePrice = _quantity*_itemPrice; if (basePrice > 1000) { return basePrice * 0.95; } else { return basePrice * 0.98; } 重构之后代码: if (BasePr

第2章 重新组织函数(3):引入解释性变量、分解临时变量和移除对参数的赋值

5. 引入解释性变量(Introduct Explaining Variable) //引入解释性变量 //重构前 if((platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0) { //do somethin

JAVA不用临时变量交换两个变量的值

交换两个变量的值,不适用临时变量 1 public class Test{ 2 public static void main(String[] args){ 3 int a = 1; 4 int b = 2; 5 // 请交换两个变量的值 6 } 7 } 交换两变量的值 加减实现交换 1 public class Test{ 2 public static void main(String[] args){ 3 int a = 1; 4 int b = 2; 5 // 请交换两个变量的值 6

两个数字交换(不使用临时变量)

#include<stdio.h> #include<stdlib.h> void swap(int* a, int* b)//普通交换 {  int tmp = *a;  *a = *b;  *b = tmp; } //不使用临时变量 void swap1(int* a, int* b)//使用加减法 {  *a = *a + *b;  *b = *a - *b;  *a = *a - *b; } void swap2(int *a, int *b)//使用异或 {  *a =