我有以下数据:
start_data <- data.frame(stringsAsFactors=FALSE,
Person = c(1, 1, 1, 1),
Event = c(1, 2, 3, 4),
Var1 = c(1, 2, 3, 5),
Var2 = c(7, 8, 9, 6),
Var3 = c(13, 14, 15, 7),
Start_Date = c("1/01/2020", "5/01/2020", "21/01/2020", "23/01/2020"),
End_Date = c("10/01/2020", "20/01/2020", "30/01/2020", "25/01/2020")
)
start_data
Person Event Var1 Var2 Var3 Start_Date End_Date
1 1 1 1 7 13 1/01/2020 10/01/2020
2 1 2 2 8 14 5/01/2020 20/01/2020
3 1 3 3 9 15 21/01/2020 30/01/2020
4 1 4 5 6 7 23/01/2020 25/01/2020
我想把它转换成:
end_data <- data.frame(stringsAsFactors=FALSE,
Person = c(1, 1, 1, 1, 1, 1),
Event = c("1", "1 AND 2", "2", "3", "3 AND 4", "3"),
Var1 = c("1", "1 AND 2", "2", "3", "3 AND 5", "3"),
Var2 = c("7", "7 AND 8", "8", "9", "9 AND 6", "9"),
Var3 = c(13, 14, 14, 15, 15, 15),
Start_Date = c("1/01/2020", "5/01/2020", "11/01/2020", "21/01/2020",
"23/01/2020", "26/01/2020"),
End_Date = c("4/01/2020", "10/01/2020", "20/01/2020", "22/01/2020",
"25/01/2020", "30/01/2020")
)
end_data
Person Event Var1 Var2 Var3 Start_Date End_Date
1 1 1 1 7 13 1/01/2020 4/01/2020
2 1 1 AND 2 1 AND 2 7 AND 8 14 5/01/2020 10/01/2020
3 1 2 2 8 14 11/01/2020 20/01/2020
4 1 3 3 9 15 21/01/2020 22/01/2020
5 1 3 AND 4 3 AND 5 9 AND 6 15 23/01/2020 25/01/2020
6 1 3 3 9 15 26/01/2020 30/01/2020
代码应该扩展数据框,以隔离重叠的开始日期和结束日期范围。当存在重叠范围时,它应该创建一个包含重叠数据的新行。因此,在查看最终表格时,不应该有开始日期和结束日期范围相互重叠。此外,应通过将结果串联起来,总结事件Var1和Var3的表格结果。Var 3也应通过取重叠范围内的最大值进行聚合。
理想情况下,我希望将这段代码应用于多个“人”,这样就可以更好地使用group_by()或与dplyr嵌套。
编辑:
根据下面的问题,在3个重叠时期的情况下。看起来是这样的;
编辑2:
@ekoam的解决方案非常接近。但是,它不涉及以下示例。事件5概括了整个时期。因此,不应缺少范围。然而,“2017-05-17”和“2017-06-11”分别缺少“开始”和“结束”。
> trial_start_data <- data.frame(stringsAsFactors=FALSE,
+ Person = c(1, 1, 1, 1),
+ Event = c(5,6,7,8),
+ Start_Date = as.Date(c("24/04/2017","09/05/2017","12/06/2017","21/06/2017"), "%d/%m/%Y"),
+ End_Date = as.Date(c("28/09/2017","16/05/2017","21/06/2017","25/06/2017"), "%d/%m/%Y")
+ )
>
> trial_start_data
Person Event Start_Date End_Date
1 1 5 2017-04-24 2017-09-28
2 1 6 2017-05-09 2017-05-16
3 1 7 2017-06-12 2017-06-21
4 1 8 2017-06-21 2017-06-25
> disjoint_subsets(trial_start_data$Start_Date, trial_start_data$End_Date)
start end
1 2017-04-24 2017-05-08
2 2017-05-09 2017-05-16
3 2017-06-12 2017-06-20
4 2017-06-21 2017-06-21
5 2017-06-22 2017-06-25
6 2017-06-26 2017-09-28