您好我在列中有数据,并且患者访问
一些患者就诊没有记录这些值。我想复制以前的访问值。我正在使用滞后功能,这是不起作用的?
数据是这样的
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
答案 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在第一次就诊时没有提供价值,所以他的第一张记录将保持为空。如果您需要使用第二次访问时的值填充它,只需按相反方向对数据集进行排序,然后对其运行相同的代码。