【问题标题】:Get date difference between first date of a group and last date of previous group in R获取R中组的第一个日期和上一个组的最后一个日期之间的日期差异
【发布时间】:2018-11-27 12:22:11
【问题描述】:

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

x = data.frame(id = c("A","A","A","A","B","B","B","B"), group = c(1,1,2,2,3,3,4,4),
               date1 = c("25/03/2017",  "26/03/2017","03/04/2017","04/04/2017",
                         "04/05/2017","26/08/2017","28/08/2017","30/08/2017"),    
               date2 = c("26/03/2017","29/03/2017","04/04/2017","04/05/2017",
                         "18/05/2017","28/08/2017","29/08/2017","31/08/2017")
                )
> x
  id group      date1      date2
1  A     1 25/03/2017 26/03/2017
2  A     1 26/03/2017 29/03/2017
3  A     2 03/04/2017 04/04/2017
4  A     2 04/04/2017 04/05/2017
5  B     3 04/05/2017 18/05/2017
6  B     3 26/08/2017 28/08/2017
7  B     4 28/08/2017 29/08/2017
8  B     4 30/08/2017 31/08/2017

我想做的是让每个人获取第二组 date1 中的第一个日期和前一组 date2 中的最后一个日期的日期差异。因此,例如,id = A 的人,我想获得“03/04/2017”和“29/03/2017”的天数差异。患者 B 也是如此。我每个人都有多个组。 我想最终得到一个这样的数据集:

y = data.frame(id = c("A","A","B","B"), group = c(1,2,3,4),
               date1 = c("26/03/2017","03/04/2017","26/08/2017","28/08/2017"),    
               date2 = c("29/03/2017","04/04/2017","28/08/2017","29/08/2017"),
               datediff = c(NA,5,NA,0)
              ) 
> y
  id group      date1      date2 datediff
1  A     1 26/03/2017 29/03/2017       NA
2  A     2 03/04/2017 04/04/2017        5
3  B     3 26/08/2017 28/08/2017       NA
4  B     4 28/08/2017 29/08/2017        0

为此,我环顾四周,发现并回答了在同一组中减去第一个和最后一个观察结果,但对不同组的最后一个和第一个观察结果一无所知。任何帮助将非常感激。谢谢。

【问题讨论】:

  • 不清楚您希望解决方案有多通用。您是否总是每个 id 有 2 个组,每个组有 2 行?
  • 我并不总是每个 id 有 2 个组,也不总是有 2 个 id。这只是我的数据集的一个示例,用于说明。我提到我在 id 中有多个组,但也许我应该更清楚。我希望解决方案尽可能通用。

标签: r dplyr data-manipulation lubridate


【解决方案1】:

这是一种更通用的方法,每个 id 应该使用 3+ 组和/或每组 3+ 行:

library(dplyr)
library(lubridate)

# update dates (if needed)
x = x %>% mutate_at(vars(matches("date")), dmy)

# get appropriate rows based on first group 
x1 = x %>%
  group_by(id) %>%
  filter(group == min(group)) %>%
  filter(date1 == max(date1)) %>%
  ungroup()

# get appropriate rows based on last group 
x2 = x %>%
  group_by(id) %>%
  filter(group == max(group)) %>%
  filter(date2 == min(date2)) %>%
  ungroup()

# combine datasets and calculate date difference
x1 %>%
  bind_rows(x2) %>%
  arrange(id, group) %>%
  group_by(id) %>%
  mutate(datediff = as.numeric(date1 - lag(date2))) %>%
  ungroup()

# # A tibble: 4 x 5
#   id    group date1      date2      datediff
#   <fct> <dbl> <date>     <date>        <dbl>
# 1 A         1 2017-03-26 2017-03-29       NA
# 2 A         2 2017-04-03 2017-04-04        5
# 3 B         3 2017-08-26 2017-08-28       NA
# 4 B         4 2017-08-28 2017-08-29        0

【讨论】:

    【解决方案2】:

    使用lubridate::dmy 解析您的字符串日期。然后您可以使用dplyr 计算date1date2 的滞后值之间的差异。 最后,过滤那些代表新组的行。

    library(dplyr)
    library(lubridate)
    x = data.frame(id = c("A","A","A","A","B","B","B","B"), group = c(1,1,2,2,3,3,4,4),
                   date1 = dmy(c("25/03/2017",  "26/03/2017","03/04/2017","04/04/2017",
                             "04/05/2017","26/08/2017","28/08/2017","30/08/2017")),    
                   date2 = dmy(c("26/03/2017","29/03/2017","04/04/2017","04/05/2017",
                             "18/05/2017","28/08/2017","29/08/2017","31/08/2017"))
    )
    
    
    
    x %>%
      group_by(id) %>%
      filter(group != lag(group) | group != lead(group)) %>%
      mutate(diff = date1 - lag(date2)) %>%
      ungroup()
    
    
    
    # A tibble: 4 x 5
      id    group date1      date2      diff     
      <fct> <dbl> <date>     <date>     <time>   
    1 A         1 2017-03-26 2017-03-29 NA days  
    2 A         2 2017-04-03 2017-04-04 " 5 days"
    3 B         3 2017-08-26 2017-08-28 NA days  
    4 B         4 2017-08-28 2017-08-29 " 0 days"
    

    如果您想要数字输出,请使用mutate(diff = as.numeric(date1 - lag(date2)))。只要您的数据已排序 (x &lt;- x[with(x, order(id, group)), ]),无论有多少人和组,它都应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 2019-04-24
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 2020-09-08
      • 2020-06-30
      • 2016-10-10
      • 2014-12-14
      • 1970-01-01
      相关资源
      最近更新 更多