如何计算具有多个 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;
我有一个包含患者数据的数据集。我想计算患者第一次就诊和最后一次去医院之间经过了多少天。我还需要一个虚拟变量 (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;