如何根据 R 中的日期聚合数据?

Posted

技术标签:

【中文标题】如何根据 R 中的日期聚合数据?【英文标题】:How to aggregate data based on dates in R? 【发布时间】:2021-11-17 10:38:50 【问题描述】:

我有一个数据库,对于同一个事件,我想将多个不同的子事件聚合成一个事件。

我只想在下一条记录的开始日期是第一条记录的结束日期之后的第二天进行聚合。因此,如果开始日期是 2015 年 5 月 22 日,记录 1 的结束日期是 2015 年 5 月 31 日,记录 2 的开始日期是 2015 年 1 月 6 日和 2015 年 6 月 15 日,则将行聚合到1 行,因此记录 1 将 22/05/2015 显示为开始日期,结束日期为 15/06/2015。

例如它看起来像;

NameDOBStart DateEnd Date John Doe 1/01/2000 22/05/2015 31/05/2015

John Doe 1/01/2000 1/06/2015 15/06/2015

John Doe 1/01/2000 16/06/2015 20/06/2015

John Doe 1/01/2000 7/07/2015 8/07/2015

Jane Doe 1/01/1985 20/06/2018 21/06/2018

Jane Doe 1/01/1985 22/06/2018 30/06/2018

Jane Doe 1/01/1985 1/07/2018 2/07/2018

Jane Doe 1/01/1985 30/07/2018 31/07/2018

我会将其汇总为以下内容;

NameDOBStart DateEnd Date

John Doe 1/01/2000 22/05/2015 20/06/2015

John Doe 1/01/2000 7/07/2015 8/07/2015

Jane Doe 1/01/1985 20/06/2018 2/07/2018

Jane Doe 1/01/1985 30/07/2018 31/07/2018

我用过下面的代码,但效果不是很好。

ddply(df,~name+dob,summarise, actualstart=min(start.date), actualend=max(end.date))

问题在于它还聚合了不直接跟随的记录。

请帮忙,谢谢。

【问题讨论】:

【参考方案1】:

这是一个使用dplyr的选项。

如果差值大于 1 天,则计算当前 Start_date 和前一个 End_date 之间的差值,然后合并日期。

library(dplyr)

df %>%
  mutate(across(-Name, lubridate::dmy)) %>%
  group_by(Name) %>%
  group_by(grp = cumsum(Start_Date - lag(End_Date, default = first(Start_Date)) > 1), .add = TRUE) %>%
  summarise(DOB = first(DOB), 
            Start_Date = min(Start_Date), 
            End_Date = max(End_Date), .groups = 'drop') %>%
  select(-grp)

#   Name    DOB        Start_Date End_Date  
#  <chr>   <date>     <date>     <date>    
#1 JaneDoe 1985-01-01 2018-06-20 2018-07-02
#2 JaneDoe 1985-01-01 2018-07-30 2018-07-31
#3 JohnDoe 2000-01-01 2015-05-22 2015-06-20
#4 JohnDoe 2000-01-01 2015-07-07 2015-07-08

数据

如果您在reproducible format 中提供数据会更容易提供帮助

df <- structure(list(Name = c("JohnDoe", "JohnDoe", "JohnDoe", "JohnDoe", 
"JaneDoe", "JaneDoe", "JaneDoe", "JaneDoe"), DOB = c("1/01/2000", 
"1/01/2000", "1/01/2000", "1/01/2000", "1/01/1985", "1/01/1985", 
"1/01/1985", "1/01/1985"), Start_Date = c("22/05/2015", "1/06/2015", 
"16/06/2015", "7/07/2015", "20/06/2018", "22/06/2018", "1/07/2018", 
"30/07/2018"), End_Date = c("31/05/2015", "15/06/2015", "20/06/2015", 
"8/07/2015", "21/06/2018", "30/06/2018", "2/07/2018", "31/07/2018"
)), class = "data.frame", row.names = c(NA, -8L))

【讨论】:

以上是关于如何根据 R 中的日期聚合数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据列中的最新日期聚合 pandas 数据框中的行?

优化 R 中的时间序列聚合

在雪花中按日期聚合数据组

如何聚合数据框并通过 r 中的重复行对列的值求和

为什么R聚合丢弃数据行?

由于 R 中的数据集大小而需要聚合时如何访问未聚合的结果