用滞后函数进行SAS纵向计算
嗨,我有一个列中的数据,患者访问 有些患者就诊时没有记录这些值,我想复制以前的就诊值,我使用的是滞后功能,它不起作用。你知道吗 数据是这样的用滞后函数进行SAS纵向计算,sas,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 你可以在这里使用RETAIN而不是LAG。
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
你可以在这里使用RETAIN而不是LAG。 保留: 如果需要相同的变量名,请拖放+重命名以将
newval
转换为oldval
名称
通常,您也会检查ID是否相同;您的示例跨id更新,因此我将其省略,但如果您不想使用
a
值更新b
记录,则需要按id添加
然后如果first.id则调用missing(newval)
在每个新ID的开始处重置它。您可以在此处使用RETAIN not LAG。
保留:
如果需要相同的变量名,请拖放+重命名以将newval
转换为oldval
名称
通常,您也会检查ID是否相同;您的示例跨id更新,因此我将其省略,但如果您不想使用
a
值更新b
记录,则需要按id添加
然后如果first.id则调用missing(newval)
在每个新ID的开始处重置它。您可以在此处使用RETAIN not LAG。
保留:
如果需要相同的变量名,请拖放+重命名以将newval
转换为oldval
名称
通常,您也会检查ID是否相同;您的示例跨id更新,因此我将其省略,但如果您不想使用
a
值更新b
记录,则需要按id添加
然后如果first.id则调用missing(newval)
在每个新ID的开始处重置它。您可以在此处使用RETAIN not LAG。
保留:
如果需要相同的变量名,请拖放+重命名以将newval
转换为oldval
名称
通常,您也会检查ID是否相同;您的示例跨id更新,因此我将其省略,但如果您不想使用
a
值更新b
记录,则需要按id添加
然后如果first.id则调用missing(newval)
在每个新ID的开始处重置它。我假设ID
字段代表您的患者ID?而且你不想使用记录在患者A和患者B之间的值等等。。。如果是,则此代码将执行以下操作:
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在第一次就诊时没有提供值,因此他的第一个记录将保持为空。如果您需要用他第二次就诊的值来填写,只需按相反的方向对数据集排序,并对其运行相同的代码。我假设
ID
字段代表您的患者ID?而且你不想使用记录在患者A和患者B之间的值等等。。。如果是,则此代码将执行以下操作:
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在第一次就诊时没有提供值,因此他的第一个记录将保持为空。如果您需要用他第二次就诊的值来填写,只需按相反的方向对数据集排序,并对其运行相同的代码。我假设
ID
字段代表您的患者ID?而且你不想使用记录在患者A和患者B之间的值等等。。。如果是,则此代码将执行以下操作:
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在第一次就诊时没有提供值,因此他的第一个记录将保持为空。如果您需要用他第二次就诊的值来填写,只需按相反的方向对数据集排序,并对其运行相同的代码。我假设
ID
字段代表您的患者ID?而且你不想使用记录在患者A和患者B之间的值等等。。。如果是,则此代码将执行以下操作:
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在第一次就诊时没有提供值,因此他的第一个记录将保持为空。如果您需要用他第二次访问的值来填充数据集,只需将数据集按相反方向排序,然后对其运行相同的代码。您能发布代码吗?啊哈,终于找到了重复的数据集。需要更好的搜索条件。你能发布代码吗?啊哈,终于找到了副本。需要更好的搜索条件。你能发布代码吗?啊哈,终于找到了副本。需要更好的搜索条件。你能发布代码吗?啊哈,终于找到了副本。需要更好的搜索词。非常感谢Robert.,它解决了我的问题。我面临着从上一个ID复制值的问题,但这非常有效!非常感谢你,罗伯特。它解决了我的问题。我正面临着t的问题