如何计算具有多个 ID 重复项的 SAS 中第一个事件和最后一个事件之间的时间?

How to calculate the time between the first event and the last event in SAS with multiple duplicates of ID?

我有一个包含患者数据的数据集。我想计算患者第一次就诊和最后一次去医院之间经过了多少天。我还需要一个虚拟变量 (0,1),如果观察是数据集中的第一个患者(根据访问日期),它的值为 1。数据集如下所示:

Patient ID  Visit date
1           2014-04-21
1           2015-01-29
1           2021-04-14
2           2020-01-03
2           2021-07-04
.           .
.           .

我想要的:

Patient ID  Visit date  First visit  Difference between first visit and last (in days)
1           2014-04-21  1            0
1           2015-01-29  0            283
1           2021-04-14  0            2550  
2           2020-01-03  1            0
2           2021-07-04  0            548
.           .           .             .
.           .           .             .

如果我按患者 ID 和访问日期以及 运行 代码对数据集进行排序:if first.PatientID then do; First_visit = 1; end; 我能够创建我的虚拟变量。我无法计算第一次和最后一次访问之间的天数差异。非常感谢任何帮助。谢谢!

您需要保留一个新变量来获取累计天数。如果您使用 SUM 语句,则会自动保留变量。如果您使用 DIF() 函数来获取当前日期和上一个日期之间的天数差异,那么您可以只保留 DAYS 变量本身,而不需要保留实际的第一个日期值。

data have;
  input ID  DATE :yymmdd.;
  format date yymmdd10.;
cards;
1 2014-04-21
1 2015-01-29
1 2021-04-14
2 2020-01-03
2 2021-07-04
;

data want;
  set have;
  by id date;
  first_visit=first.id;
  days + dif(date);
  if first.id then days=0;
run;

一些注意事项。

第一个。变量已经编码为 1/0,因此只需使用赋值语句将其值保存到永久变量中。

不要有条件地运行 DIF() 函数。这将跳过将当前日期添加到堆栈中以供下次检索。这就是为什么在第一次观察 ID 时将 DAYS 强制为零之前,您应该将 DIF() 添加到 DAYS。

结果:

                           first_
Obs    ID          DATE     visit    days

 1      1    2014-04-21       1         0
 2      1    2015-01-29       0       283
 3      1    2021-04-14       0      2550
 4      2    2020-01-03       1         0
 5      2    2021-07-04       0       548
data WANT;
  set HAVE;
  by ID;
  first_visit = first.ID;
  retain firstDate;
  if first.ID then firstDate = Date;
  days = Date - firstDate;
  drop firstDate;
run;