【问题标题】:Calculating the difference between two dates by group with caveat使用警告按组计算两个日期之间的差异
【发布时间】:2022-01-20 01:18:58
【问题描述】:

数据如下所示:

df <- data.frame(
  id = c(283,994,294,294,1001,1001), 
  stint = c(1,1,1,2,1,2), 
  admit = c("2010-2-3","2011-2-4","2011-3-4","2012-4-1","2016-1-2","2017-2-3"),
  release = c("2011-2-3","2011-2-28","2011-4-1","2014-6-6","2017-2-1","2018-3-1")
)

好吧,请多多包涵,因为我发现这种语言很难表达。我需要通过 id 计算第一阶段的发布日期和第二阶段的录取日期之间的差异。因此对于上面的示例,我称之为“曝光”的差异应该是这样的

exposure=c(NA,NA,365,NA,2,NA)

因此,如果只有 1 次,则将返回 NA,如果有超过 1 次,则曝光期将使用之前的发布日期和当前的录取日期来计算。所以第三阶段的曝光将是第三阶段的承认——第二阶段的释放。

【问题讨论】:

    标签: r date tidyverse lubridate


    【解决方案1】:

    如果 stint == 2,您要计算曝光,否则返回 NA。这可以通过 ifelse 来实现。但是,您希望该版本来自之前的发布日期。这可以通过滞后来完成。但这会将暴露值与暴露 ==2 的承认联系起来,而您希望暴露与计算中使用的先前版本相关联。因此,删除第一个曝光值并在末尾添加一个 NA。

      df %>% 
        mutate(across(c(admit, release), as.Date), 
               exposure = c(ifelse(stint == 2, admit - lag(release), NA)[-1], NA))
    

    产量

        id stint      admit    release exposure
    1  283     1 2010-02-03 2011-02-03       NA
    2  994     1 2011-02-04 2011-02-28       NA
    3  294     1 2011-03-04 2011-04-01      366
    4  294     2 2012-04-01 2014-06-06       NA
    5 1001     1 2016-01-02 2017-02-01        2
    6 1001     2 2017-02-03 2018-03-01       NA
    

    【讨论】:

      【解决方案2】:

      这是dplyr 方法。我们将找到admit (release) 的值,其中stint 为2 (1),取其差,然后将每组id 的第一个曝光值替换为该值。

      library(dplyr)
      
      df %>% 
        mutate(
          across(c(admit, release), as.Date), 
          exposure = NA_integer_
        ) %>% 
        group_by(id) %>% 
        mutate(exposure = replace(
          exposure, 1L, 
          as.integer(admit[match(2, stint)] - release[match(1, stint)])
        ))
        
      

      输出

      # A tibble: 6 x 5
      # Groups:   id [4]
           id stint admit      release    exposure
        <dbl> <dbl> <date>     <date>        <int>
      1   283     1 2010-02-03 2011-02-03       NA
      2   994     1 2011-02-04 2011-02-28       NA
      3   294     1 2011-03-04 2011-04-01      366
      4   294     2 2012-04-01 2014-06-06       NA
      5  1001     1 2016-01-02 2017-02-01        2
      6  1001     2 2017-02-03 2018-03-01       NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 2021-11-25
        • 2011-08-01
        • 2016-11-13
        相关资源
        最近更新 更多