r - 如何根据 R 中的日期聚合数据?
问题描述
我有一个数据库,对于同一个事件,我想将多个不同的子事件聚合成一个事件。
我只想在下一条记录的开始日期是第一条记录的结束日期之后的第二天聚合它。因此,如果开始日期是 2015 年 5 月 22 日,记录 1 的结束日期是 2015 年 5 月 31 日,记录 2 的开始日期是 2015 年 1 月 6 日和 2015 年 6 月 15 日,则将行聚合到1 行,因此记录 1 显示 22/05/2015 作为开始日期,结束日期为 15/06/2015。
例如,它看起来像;
Name
DOB
Start Date
End 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
我会将其汇总为以下内容;
Name
DOB
Start Date
End 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))
问题是它还聚合了不直接遵循的记录。
请帮忙,谢谢。
解决方案
这是使用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
数据
如果您以可重现的格式提供数据,则更容易提供帮助
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))
推荐阅读
- javascript - 从 NodeJs Cloud Function 传输文件时如何解决编码问题?
- c# - 正则表达式分组不返回任何值
- javascript - (Javascript)当认为不正确时,试图在刽子手游戏中只允许按键一次
- python - Mongodb聚合枢轴一个嵌入式列表
- javascript - 如何在鼠标关闭时反转@keyframe 动画?
- symfony4 - 找不到模板文件夹
- python - 如何获取发送消息的人的头像网址?
- java - Java 为什么我输入的每个输入都会忽略我的 While 循环?
- java - Jaxb 编组相同的 XML 消息
- node.js - 如何在服务内部发布和填充待办事项(无关系数组)?todos:没有关系嵌套数组。服务:模型的对象