【问题标题】:dplyr: fill series in grouped data.frame after using lead()dplyr:使用lead()后在分组的data.frame中填充系列
【发布时间】:2018-08-13 15:25:04
【问题描述】:

请考虑以下几点:

在与以下示例类似的data.frame 中,记录了每位患者的用药日期。目标是计算“到下一次治疗的时间”,其定义为从一次治疗开始到下一次治疗开始之间的天数。 data.frame 中的所有其他列(此处未显示)包含需要保留的不同信息。


我的做法如下:

library("dplyr")
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
db <- data.frame(id = c(rep("a", 5), rep("b", 3)),
                 date = c(rep(as.Date("2018-01-01"), 3),
                          rep(as.Date("2018-01-20"), 2),
                          rep(as.Date("2018-01-01"), 3)))
db
#>   id       date
#> 1  a 2018-01-01
#> 2  a 2018-01-01
#> 3  a 2018-01-01
#> 4  a 2018-01-20
#> 5  a 2018-01-20
#> 6  b 2018-01-01
#> 7  b 2018-01-01
#> 8  b 2018-01-01

db %>%
  group_by(id) %>% 
  mutate(time.to.next = as.numeric(lead(date) - date))
#> Warning: package 'bindrcpp' was built under R version 3.4.4
#> # A tibble: 8 x 3
#> # Groups:   id [2]
#>   id    date       time.to.next
#>   <fct> <date>            <dbl>
#> 1 a     2018-01-01           0.
#> 2 a     2018-01-01           0.
#> 3 a     2018-01-01          19.
#> 4 a     2018-01-20           0.
#> 5 a     2018-01-20          NA 
#> 6 b     2018-01-01           0.
#> 7 b     2018-01-01           0.
#> 8 b     2018-01-01          NA

reprex package (v0.2.0) 于 2018 年 8 月 13 日创建。


然而,我需要的是一个看起来像这样的data.frame(或tibble):

#> # A tibble: 8 x 3
#> # Groups:   id [2]
#>   id    date       time.to.next
#>   <fct> <date>            <dbl>
#> 1 a     2018-01-01          19.
#> 2 a     2018-01-01          19.
#> 3 a     2018-01-01          19.
#> 4 a     2018-01-20          NA
#> 5 a     2018-01-20          NA 
#> 6 b     2018-01-01          NA
#> 7 b     2018-01-01          NA
#> 8 b     2018-01-01          NA

问题:我如何才能使每组的所有值都相同,尽管唯一的计算值是一组的最后一次观察与下一组的第一次观察之间的差异? p>

非常感谢。

【问题讨论】:

    标签: r group-by dplyr lead


    【解决方案1】:

    一种选择是首先删除 iddate 中的所有重复项,计算时间差,然后在 id上使用db 重新加入> 和 日期 列:

    db %>% 
        select(id, date) %>%
        distinct() %>% 
        group_by(id) %>% 
        mutate(time.to.next = as.numeric(lead(date) - date)) %>% 
        inner_join(db)
    
    #Joining, by = c("id", "date")
    # A tibble: 8 x 3
    # Groups:   id [?]
    #  id    date       time.to.next
    #  <fct> <date>            <dbl>
    #1 a     2018-01-01           19
    #2 a     2018-01-01           19
    #3 a     2018-01-01           19
    #4 a     2018-01-20           NA
    #5 a     2018-01-20           NA
    #6 b     2018-01-01           NA
    #7 b     2018-01-01           NA
    #8 b     2018-01-01           NA
    

    【讨论】:

    • 我使用这种方法删除select(),而是将参数iddate 放入distinct(),因为这会做同样的事情。谢谢!
    【解决方案2】:

    另一种选择是计算每个date 和该id 的max(date) 之间的距离,然后用NA 替换零

    db <- data.frame(id = c(rep("a", 5), rep("b", 3)),
                     date = c(rep(as.Date("2018-01-01"), 3),
                              rep(as.Date("2018-01-20"), 2),
                              rep(as.Date("2018-01-01"), 3)))
    
    library(dplyr)
    
    db %>%
      group_by(id) %>% 
      mutate(time.to.next = as.numeric(max(date) - date),
             time.to.next = ifelse(time.to.next > 0, time.to.next, NA)) %>%
      ungroup()
    
    # # A tibble: 8 x 3
    #   id    date       time.to.next
    #   <fct> <date>            <dbl>
    # 1 a     2018-01-01           19
    # 2 a     2018-01-01           19
    # 3 a     2018-01-01           19
    # 4 a     2018-01-20           NA
    # 5 a     2018-01-20           NA
    # 6 b     2018-01-01           NA
    # 7 b     2018-01-01           NA
    # 8 b     2018-01-01           NA
    

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多