一、问题场景:一个患者(患者标识PID)会有多次就诊记录(就诊标识VID),每次就诊中可能会有多条手术记录,现在想给患者的每次就诊中的多次手术记录都打上标签(surgery_order):1、2...n 表明这是患者的第一次就诊时的手术、第二次就诊时的手术...第n次就诊时的手术。即长这样:
Obs | PID | VID | surgery_order |
1 | 1 | A | 1 |
2 | 1 | B | 2 |
3 | 1 | B | 2 |
4 | 1 | C | 3 |
5 | 2 | D | 1 |
6 | 2 | D | 1 |
7 | 2 | E | 2 |
二、背景知识:
1、SAS可以实现“识别同一个组内的多个观测行数据中的第一个变量或最后一个变量”的功能,这个功能可以由“first 和 last ”临时变量实现。具体参考:http://blog.sina.com.cn/s/blog_760f92f701014s4s.html 、http://www.cnblogs.com/zhangzhangwhu/p/7230047.html
2、retain语句:可以避免data步在每次迭代(每处理一行数据就是一次迭代)中将retain 的变量初始化为缺失。具体参考:http://www.cnblogs.com/zhangzhangwhu/p/7223163.html
背景知识总结:
1、first / last 变量只能在data步中使用。
2、first / last 变量使用时,需要在data步前对标识这些观测为一个组的变量var(如一个患者的多条观测为一组,那么组标识变量就是患者的PID)进行排序:proc sort ...by var 。
3、SAS在处理 first / last 变量时,对组内每个观测行隐性地生成了一个first 和 一个last 变量,组内第一行first.var=1,last.var=0,...,最后一行 first.var=0,last.var=1,相应的,该组内如果只有一行观测,那么 first.var=1,last.var=1,例如:
***创建数据;
DATA ONE;
INPUT SUBJECT SCORE;
DATALINES;
11
21
31
12
41
13
22
42
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;
4、当by 多个变量时,如两个:by var1 var2,SAS则分别以var1组和var2组生成first.var1、last.var1 和 first.var2、last.var2 变量:
DATA surgery;
INFORMAT PID VID $1.;
INPUT PID VID;
DATALINES;
1 A
1 B
1 B
1 C
2 D
2 D
2 E
;
PROC SORT DATA=surgery;
BY PID VID;
RUN;
DATA sur;
SET surgery;
BY PID VID;
FIRST_PID = FIRST.PID;
LAST_PID = LAST.PID;
FIRST_VID = FIRST.VID;
LAST_VID = LAST.VID;
PROC PRINT DATA=sur;
TITLE "Listing of Data Set sur";
RUN;
Obs | PID | VID | FIRST_PID | LAST_PID | FIRST_VID | LAST_VID |
1 | 1 | A | 1 | 0 | 1 | 1 |
2 | 1 | B | 0 | 0 | 1 | 0 |
3 | 1 | B | 0 | 0 | 0 | 1 |
4 | 1 | C | 0 | 1 | 1 | 1 |
5 | 2 | D | 1 | 0 | 1 | 0 |
6 | 2 | D | 0 | 0 | 0 | 1 |
7 | 2 | E | 0 | 1 | 1 | 1 |
因字数限制,解决办法见回答。