【问题标题】:Identify the most recent date before another date from another column per group using dplyr?使用 dplyr 从每组的另一列中识别另一个日期之前的最近日期?
【发布时间】:2020-08-17 21:58:58
【问题描述】:

我有一个如下结构的数据框:

example <- data.frame(id = c(1,1,1,2,2,2,3,3,3),
                         delivereddate = c("7/20/2019","7/24/2019","7/28/2019","3/24/2019","4/13/2019","4/25/2019","11/13/2019","11/20/2019","11/27/2019"),
                         applieddate = c("7/22/2019","7/22/2019","7/22/2019",NA,NA,NA,"11/21/2019","11/21/2019","11/21/2019"))

我正在尝试添加一个列,用于标识每个 ID 的应用日期之前的最近交付日期。我试图获得的最终结果的一个示例如下:

desiredresult <- data.frame(id = c(1,1,1,2,2,2,3,3,3),
                            delivereddate = c("7/20/2019","7/24/2019","7/28/2019","3/24/2019","4/13/2019","4/25/2019","11/13/2019","11/20/2019","11/27/2019"),
                            applieddate = c("7/22/2019","7/22/2019","7/22/2019",NA,NA,NA,"11/21/2019","11/21/2019","11/21/2019"),
                            applied = c(1,0,0,0,0,0,0,1,0))

我需要应用的列是二进制的(0 或 1),并且每个 id 只能有 1 行带有 1 标志。如果一个 id 没有应用日期,那么所有行的应用标志都是 0。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用findInterval

    library(dplyr)
    library(lubridate)
    example %>% 
          dplyr::group_by(id) %>% 
          dplyr::mutate(applied = +(row_number() %in% 
                  findInterval(lubridate::mdy(first(applieddate)), 
                              lubridate::mdy(delivereddate))))
    # A tibble: 9 x 4
    # Groups:   id [3]
    #     id delivereddate applieddate applied
    #  <dbl> <chr>         <chr>         <int>
    #1     1 7/20/2019     7/22/2019         1
    #2     1 7/24/2019     7/22/2019         0
    #3     1 7/28/2019     7/22/2019         0
    #4     2 3/24/2019     <NA>              0
    #5     2 4/13/2019     <NA>              0
    #6     2 4/25/2019     <NA>              0
    #7     3 11/13/2019    11/21/2019        0
    #8     3 11/20/2019    11/21/2019        1
    #9     3 11/27/2019    11/21/2019        0
    

    【讨论】:

      【解决方案2】:

      您可以将列转换为日期类,从delivereddate 中减去applieddate 并取绝对值。然后,对于每个id,我们将 1 分配给观察到最小差异的索引。

      library(dplyr)
      
      example %>%
        mutate(across(ends_with('date'), lubridate::mdy), 
               applied = abs(delivereddate - applieddate)) %>%
        group_by(id) %>%
        mutate(applied = +(row_number() %in% which.min(applied)))
      
      #     id delivereddate applieddate applied
      #  <dbl> <date>        <date>        <int>
      #1     1 2019-07-20    2019-07-22        1
      #2     1 2019-07-24    2019-07-22        0
      #3     1 2019-07-28    2019-07-22        0
      #4     2 2019-03-24    NA                0
      #5     2 2019-04-13    NA                0
      #6     2 2019-04-25    NA                0
      #7     3 2019-11-13    2019-11-21        0
      #8     3 2019-11-20    2019-11-21        1
      #9     3 2019-11-27    2019-11-21        0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-11
        • 2020-11-20
        • 2019-08-16
        • 2020-11-17
        • 2020-06-30
        • 2022-10-05
        • 2014-01-13
        相关资源
        最近更新 更多