用滞后函数进行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的问题