r - R如何找到患者就诊间隔
问题描述
我有一个看起来像这样的患者数据集
ID | Visit Date | Category |
1 | 10/10/2019 | Derma |
1 | 12/10/2019 | Derma |
1 | 14/10/2019 | Derma |
1 | 20/10/2019 | Eye |
1 | 15/10/2019 | Eye |
1 | 07/10/2019 | O&G |
1 | 08/10/2019 | O&G |
2 | 20/10/2019 | Derma |
2 | 22/10/2019 | Derma |
2 | 24/10/2019 | Derma |
2 | 05/10/2019 | Eye |
2 | 10/10/2019 | Eye |
2 | 12/10/2019 | Eye |
对于每个患者,我试图找到每个就诊类别之间的就诊间隔,其定义如下:所有类别值的第 2 次最早就诊日期 - 所有类别值的最早就诊日期
因此,对于患者 1,最早的就诊日期是 2019 年 7 月 10 日的 O&G,而最早的第二次就诊日期是 2019 年 10 月 10 日的 Derma。所以访问间隔是3 天。
对于患者 2,最早的就诊日期是 2019 年 5 月 10 日的眼睛,而第二个最早的就诊日期是 2019 年 10 月 20 日的 Derma。所以访问间隔是15 天。
预期结果:
ID | Visit Date | Category | Visit Interval |
1 | 10/10/2019 | Derma | 3 Days |
1 | 12/10/2019 | Derma | 3 Days |
1 | 14/10/2019 | Derma | 3 Days |
1 | 20/10/2019 | Eye | 3 Days |
1 | 15/10/2019 | Eye | 3 Days |
1 | 07/10/2019 | O&G | 3 Days |
1 | 08/10/2019 | O&G | 3 Days |
2 | 20/10/2019 | Derma | 15 Days |
2 | 22/10/2019 | Derma | 15 Days |
2 | 24/10/2019 | Derma | 15 Days |
2 | 05/10/2019 | Eye | 15 Days |
2 | 10/10/2019 | Eye | 15 Days |
2 | 12/10/2019 | Eye | 15 Days |
请使用以下代码将数据集输入 R:
library(readr)
df <- read_delim("ID | Visit Date | Category
1 | 10/10/2019 | Derma
1 | 12/10/2019 | Derma
1 | 14/10/2019 | Derma
1 | 20/10/2019 | Eye
1 | 15/10/2019 | Eye
1 | 07/10/2019 | O&G
1 | 08/10/2019 | O&G
2 | 20/10/2019 | Derma
2 | 22/10/2019 | Derma
2 | 24/10/2019 | Derma
2 | 05/10/2019 | Eye
2 | 10/10/2019 | Eye
2 | 12/10/2019 | Eye", delim = "|", trim_ws = TRUE)
解决方案
一种可能的解决方案是
library(dplyr)
df %>%
mutate(`Visit Date` = as.Date(`Visit Date`, "%d/%m/%Y")) %>%
group_by(ID, Category) %>%
mutate(first_date_category = first(`Visit Date`, order_by = `Visit Date`)) %>%
group_by(ID) %>%
mutate(`Visit Interval` = nth(unique(first_date_category), 2, order_by = unique(first_date_category)) - first(unique(first_date_category), order_by = unique(first_date_category))) %>%
select(-first_date_category)
基本上,我们首先创建first_date_category
代表每个组患者类别的第一个日期的列。然后我们只根据患者分组ID
,我们按时间顺序排列的unique
值,first_date_category
我们取第二个和第一个日期之间的差异。
输出
# A tibble: 13 x 4
# Groups: ID [2]
# ID `Visit Date` Category `Visit Interval`
# <dbl> <date> <chr> <drtn>
# 1 1 2019-10-10 Derma 3 days
# 2 1 2019-10-12 Derma 3 days
# 3 1 2019-10-14 Derma 3 days
# 4 1 2019-10-20 Eye 3 days
# 5 1 2019-10-15 Eye 3 days
# 6 1 2019-10-07 O&G 3 days
# 7 1 2019-10-08 O&G 3 days
# 8 2 2019-10-20 Derma 15 days
# 9 2 2019-10-22 Derma 15 days
# 10 2 2019-10-24 Derma 15 days
# 11 2 2019-10-05 Eye 15 days
# 12 2 2019-10-10 Eye 15 days
# 13 2 2019-10-12 Eye 15 days