具有滞后函数的SAS纵向计算

时间:2014-07-21 16:15:07

标签: sas

您好我在列中有数据,并且患者访问

一些患者就诊没有记录这些值。我想复制以前的访问值。我正在使用滞后功能,这是不起作用的?

数据是这样的

ID value 
A   22
A   . 
A   23
B   . 
B   12
C   3
C  .
C  .
C  .
C  21

所需的输出。,

ID value 
A   22
A   22 
A   23
B   23 
B   12
C   3
C   3
C   3
C   3
C  21

2 个答案:

答案 0 :(得分:2)

您可以在此处使用RETAIN而不是LAG。 保留:

data want;
 set have;
 retain newval;
 if not missing(oldval) then newval=oldval;
run;

如果您需要相同的变量名称,请删除+重命名以将newval转换为oldval名称。

通常,您还要检查ID是否相同;您的示例会更新ID,因此我将其保留,但如果您不想更新b值为a的记录,则需要添加by id;然后if first.id then call missing(newval);在每个新ID的开头重置它。

答案 1 :(得分:1)

我假设ID字段代表您的患者ID?并且您不想使用针对患者B等记录患者A的值...如果是这样,那么此代码将完成这项工作:

data test;
  infile datalines truncover;
  input ID $ value ;

datalines;
A 22
A  
A 23
B  
B 12
C 3
C  
C  
C  
C 21
;
run;

先排序,以便我们可以使用分组处理:

proc sort data=test;
  by id;
run;

我更喜欢使用retain语句而不是lag()函数,因为人们不太可能使用retain犯错:

data final;
  set test;
  by id;

  retain prev_value .;

  if first.id then do;
    prev_value = .;  * RESET THIS VALUE EVERY TIME WE GET TO A NEW PATIENT;
  end;

  if value eq . then do;
    value = prev_value; * VALUE IS MISSING SO ASSIGN THE PREVIOUS RECORDED VALUE FOR THE PATIENT AGAINST IT;
  end;
  else do;
    prev_value = value; * PATIENT HAS A NEW VALUE TO RECORD SO SAVE IT INTO THE PREV_VALUE VARIABLE;
  end;

run;

顺便提一下,这会给你的要求略有不同,因为病人B在第一次就诊时没有提供价值,所以他的第一张记录将保持为空。如果您需要使用第二次访问时的值填充它,只需按相反方向对数据集进行排序,然后对其运行相同的代码。