【问题标题】:R How to find Patient Visit IntervalR如何找​​到患者就诊间隔
【发布时间】:2020-05-12 09:55:53
【问题描述】:

我有一个看起来像这样的患者数据集

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      |

对于每个患者,我试图找到每个就诊类别之间的就诊间隔,其定义如下:所有类别值的第二个最早就诊日期 - 所有类别值的最早就诊日期

因此,对于患者 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)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    一种可能的解决方案是

    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分组,我们按时间顺序排列first_date_categoryunique值,我们取第二个和第一个日期之间的差。

    输出

    # 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
    

    【讨论】:

      【解决方案2】:

      我们首先将Visit Date 更改为实际日期对象,arrange 基于IDVisit Date 的日期,为每个ID 创建一个定义顺序的rank 列,选择两个@ 中的第一个条目987654327@ 并得到它们之间的区别。

      library(dplyr)
      
      df %>%
        mutate(`Visit Date` = lubridate::dmy(`Visit Date`)) %>%
        arrange(ID, `Visit Date`) %>%
        group_by(ID) %>%
        mutate(rank = match(Category, unique(Category)), 
               interval = diff(`Visit Date`[match(1:2, rank)])) %>%
        select(-rank)
      
      
      #      ID `Visit Date` Category interval
      #   <dbl> <date>       <chr>    <drtn>  
      # 1     1 2019-10-07   O&G       3 days 
      # 2     1 2019-10-08   O&G       3 days 
      # 3     1 2019-10-10   Derma     3 days 
      # 4     1 2019-10-12   Derma     3 days 
      # 5     1 2019-10-14   Derma     3 days 
      # 6     1 2019-10-15   Eye       3 days 
      # 7     1 2019-10-20   Eye       3 days 
      # 8     2 2019-10-05   Eye      15 days 
      # 9     2 2019-10-10   Eye      15 days 
      #10     2 2019-10-12   Eye      15 days 
      #11     2 2019-10-20   Derma    15 days 
      #12     2 2019-10-22   Derma    15 days 
      #13     2 2019-10-24   Derma    15 days 
      

      rank 是每个ID 出现的每个Category 的顺序,因此对于ID = 1O&amp;G 具有rank 为1,Derma 具有rank 为2 和@987654337 @ 有rank 为3。对于interval,我们选择前2 个(1:2)排名的第一个条目,即(2019-10-072019-10-10)并取它们之间的差。

      【讨论】:

      • 你能解释一下这部分吗:mutate(rank = match(Category, unique(Category)), interval = diff(`Visit Date`[match(1:2, rank)]))
      • @spidermarn 我用一些解释更新了答案。
      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      相关资源
      最近更新 更多