如何基于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个日期时间变量合并行的主要内容,如果未能解决你的问题,请参考以下文章

如何创建片段以重复变量编号中的代码行

如何将列中的所有数据移动到单个列(不合并),然后拆分为R中的新列?

基于R中的行名合并数据框

如何根据 R 中的行标记数据框中的所有变量

如何通过在R语言中对相同的变量进行分组来将行合并为单列

在 R 中使用合并函数时重复行 - 但我不想要总和