首页 > 解决方案 > 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)

标签: rdplyr

解决方案


一种可能的解决方案是

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

推荐阅读