如何基于R中的2个日期时间变量合并行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何基于R中的2个日期时间变量合并行相关的知识,希望对你有一定的参考价值。
我想合并数据集df
中的行,这样对于每个记录ID,如果一行的End_Date
等于下一行的Start_Date
,那么我想将它们组合起来。
我想的当前逻辑是首先按ID分组然后从第1行循环到第n行()。如果第1行的End_Date
等于第2行的Start_Date
,则将第1行的End_Date
替换为第2行的End_Date
并删除第2行。然后将第1行与新第2行进行比较,依此类推。
非常感谢有关如何为此编写代码的任何帮助或建议。谢谢!
df <- read.table(text = "
ID Start_Date End_Date
1 09/09/2016 11/09/2016
1 11/09/2016 17/09/2016
1 17/09/2016 23/11/2016
1 23/11/2016 28/11/2016
1 28/11/2016 14/12/2016
1 14/12/2016 22/12/2016
1 22/12/2016 23/12/2016
1 25/12/2016 03/01/2017
1 06/01/2017 07/02/2017
1 07/02/2017 22/02/2017
1 22/02/2017 27/02/2017
1 28/03/2017 30/05/2017
1 12/06/2017 03/07/2017
1 03/07/2017 04/07/2017
1 14/08/2017 14/08/2017
1 15/08/2017 23/08/2017
1 23/08/2017 24/08/2017
1 24/08/2017 28/08/2017
1 07/09/2017 07/09/2017
1 24/09/2017 24/09/2017
1 01/10/2017 08/11/2017
1 08/11/2017 31/12/2017
2 08/08/2017 10/08/2017
2 10/08/2017 11/08/2017", stringsAsFactors = FALSE, header = TRUE)
输出数据应如下所示:
df_new <- read.table(text = "
ID Start_Date End_Date
1 09/09/2016 23/12/2016
1 25/12/2016 03/01/2017
1 06/01/2017 27/02/2017
1 28/03/2017 30/05/2017
1 12/06/2017 04/07/2017
1 14/08/2017 14/08/2017
1 15/08/2017 28/08/2017
1 07/09/2017 07/09/2017
1 24/09/2017 24/09/2017
1 01/10/2017 31/12/2017
2 08/08/2017 11/08/2017", stringsAsFactors = FALSE, header = TRUE)
答案
这是一个dplyr解决方案:
df %>%
mutate(collapse = Start_Date == lag(End_Date),
group = cumsum(c(0, tail(!collapse, -1)))) %>%
group_by(group) %>%
summarise(Start_Date = first(Start_Date),
End_Date = last(End_Date)) %>%
select(Start_Date, End_Date)
我鼓励你逐行运行,检查发生了什么!
首先,它创建一个新的列折叠,如果记录的开始日期等于上一个记录的结束日期,则为true。因为第一行没有先前的记录,所以你会得到第1行的NA。
接下来,通过获取折叠列的累积总和来创建新的组列,但是第一行上的NA被修剪并替换为0.折叠需要被否定,因为我们只希望在遇到时增加值不应合并的行。
最后,组列允许我们通过总结进行简单的分组。在这种情况下,我忽略了ID列。
(这也假设您的数据排序很好,并且您不担心重叠的日期范围)。
以上是关于如何基于R中的2个日期时间变量合并行的主要内容,如果未能解决你的问题,请参考以下文章