如何将事件日期转换为 R 中的纵向数据?
How to convert event dates to longitudinal data in R?
我有一个包含出生、诊断和死亡日期的个体受试者记录的数据集。我想将其转化为纵向数据,显示受试者在研究期间每周是否已经出生、是否已被诊断(诊断可能发生在出生前或出生后)或死亡。请注意,出生或诊断可能发生在研究期之前。
学习期:4/1/2021 - 4/31/2021(每周从星期一开始,因此实际学习周将从 3/29/2021、4/5/2021、4/12/2021、 2021 年 4 月 19 日和 2021 年 4 月 26 日)。
示例数据:
tibble(id=seq(1:4),
date_birth=c("2/28/2021", "3/2/2021", "4/3/2021", "4/15/2021"),
date_dx=c("3/4/2021", "4/15/2021", NA, "4/9/2021"),
date_death=c("4/5/2021", "4/20/2021", NA, "4/23/2021"))
逻辑:
如果 date_birth <= study_week,出生 = 1,否则出生 = 0
如果 date_dx <= study_week,dx = 1,否则 dx = 0
如果 date_death <= study_week,死亡 = 1,否则死亡 = 0
主题永远不会从 1 回到 0
期望输出:
tibble(study_week=rep(seq.Date(as.Date("3/29/2021", format="%m/%d/%Y"), by="week", length.out = 5),4),
id=c(rep(1,5), rep(2,5), rep(3,5), rep(4,5)),
born=c(1,1,1,1,1,
1,1,1,1,1,
0,1,1,1,1,
0,0,0,1,1),
dx=c(1,1,1,1,1,
0,0,0,1,1,
0,0,0,0,0,
0,0,1,1,1),
dead=c(0,1,1,1,1,
0,0,0,0,1,
0,0,0,0,0,
0,0,0,0,1))
如何创建此输出?谢谢!
我使用了一种很有效的奇怪方法。我只是将学习周作为列,融化 data.frame 并使用 ifelse
.
比较值
library(data.table) #load data.table package
# load your data as data.table
a = data.table(id=seq(1:4),
date_birth=c("2/28/2021", "3/2/2021", "4/3/2021", "4/15/2021"),
date_dx=c("3/4/2021", "4/15/2021", NA, "4/9/2021"),
date_death=c("4/5/2021", "4/20/2021", NA, "4/23/2021"))
# convert dates to date format using {lubridate}
a[, c("date_birth", "date_dx", "date_death") := lapply(.SD, lubridate::mdy), .SDcols = 2:4]
studyWeeks = lubridate::mdy(c("3/29/2021", "4/5/2021", "4/12/2021", "4/19/2021", "4/26/2021"))
# add columns with names same as study weeks, put a dummy (0) value
a[, c(as.character(studyWeeks)) := 0]
# now calculate the result
result = melt(a, 1:4)[, `:=` (born = ifelse(date_birth <= ymd(variable), 1, 0), dx = ifelse(date_dx <= ymd(variable), 1, 0), dead = ifelse(date_death <= ymd(variable), 1, 0))]
# a little cosmetics
result = result[, .(study_week = ymd(variable), id, born, dx, dead)]
“现在计算结果”行中的内容:
melt(a, 1:4)
:将宽table转换为长table,保留1到4列。接下来是标准的data.table链接(][
大致相同作为 |>
或 %>%
)
:=
是赋值运算符。这意味着我们会将 right-hand 值分配给 data.table. 内的 left-hand 列
- 您可能理解所有
ifelse
语句。 ymd
转换为日期(来自 {lubridate})。
我忘了说,我建议你在这个人还没有出生/诊断/死亡的时候保留 NA
而不是 0
.
如果你想用0
替换NA
,那么你可以这样做。
我有一个包含出生、诊断和死亡日期的个体受试者记录的数据集。我想将其转化为纵向数据,显示受试者在研究期间每周是否已经出生、是否已被诊断(诊断可能发生在出生前或出生后)或死亡。请注意,出生或诊断可能发生在研究期之前。
学习期:4/1/2021 - 4/31/2021(每周从星期一开始,因此实际学习周将从 3/29/2021、4/5/2021、4/12/2021、 2021 年 4 月 19 日和 2021 年 4 月 26 日)。
示例数据:
tibble(id=seq(1:4),
date_birth=c("2/28/2021", "3/2/2021", "4/3/2021", "4/15/2021"),
date_dx=c("3/4/2021", "4/15/2021", NA, "4/9/2021"),
date_death=c("4/5/2021", "4/20/2021", NA, "4/23/2021"))
逻辑:
如果 date_birth <= study_week,出生 = 1,否则出生 = 0
如果 date_dx <= study_week,dx = 1,否则 dx = 0
如果 date_death <= study_week,死亡 = 1,否则死亡 = 0
主题永远不会从 1 回到 0
期望输出:
tibble(study_week=rep(seq.Date(as.Date("3/29/2021", format="%m/%d/%Y"), by="week", length.out = 5),4),
id=c(rep(1,5), rep(2,5), rep(3,5), rep(4,5)),
born=c(1,1,1,1,1,
1,1,1,1,1,
0,1,1,1,1,
0,0,0,1,1),
dx=c(1,1,1,1,1,
0,0,0,1,1,
0,0,0,0,0,
0,0,1,1,1),
dead=c(0,1,1,1,1,
0,0,0,0,1,
0,0,0,0,0,
0,0,0,0,1))
如何创建此输出?谢谢!
我使用了一种很有效的奇怪方法。我只是将学习周作为列,融化 data.frame 并使用 ifelse
.
library(data.table) #load data.table package
# load your data as data.table
a = data.table(id=seq(1:4),
date_birth=c("2/28/2021", "3/2/2021", "4/3/2021", "4/15/2021"),
date_dx=c("3/4/2021", "4/15/2021", NA, "4/9/2021"),
date_death=c("4/5/2021", "4/20/2021", NA, "4/23/2021"))
# convert dates to date format using {lubridate}
a[, c("date_birth", "date_dx", "date_death") := lapply(.SD, lubridate::mdy), .SDcols = 2:4]
studyWeeks = lubridate::mdy(c("3/29/2021", "4/5/2021", "4/12/2021", "4/19/2021", "4/26/2021"))
# add columns with names same as study weeks, put a dummy (0) value
a[, c(as.character(studyWeeks)) := 0]
# now calculate the result
result = melt(a, 1:4)[, `:=` (born = ifelse(date_birth <= ymd(variable), 1, 0), dx = ifelse(date_dx <= ymd(variable), 1, 0), dead = ifelse(date_death <= ymd(variable), 1, 0))]
# a little cosmetics
result = result[, .(study_week = ymd(variable), id, born, dx, dead)]
“现在计算结果”行中的内容:
melt(a, 1:4)
:将宽table转换为长table,保留1到4列。接下来是标准的data.table链接(][
大致相同作为|>
或%>%
):=
是赋值运算符。这意味着我们会将 right-hand 值分配给 data.table. 内的 left-hand 列
- 您可能理解所有
ifelse
语句。ymd
转换为日期(来自 {lubridate})。
我忘了说,我建议你在这个人还没有出生/诊断/死亡的时候保留 NA
而不是 0
.
如果你想用0
替换NA
,那么你可以这样做。