【发布时间】:2019-09-09 09:24:22
【问题描述】:
我有一个数据集,其中基本上是与个人相关的时间片段,这些片段可以重叠(即,一个片段可以开始较晚,但比前一个片段更早结束)。由于这个重叠问题,一旦它们按 start_date 排序,我就很难在序列中获取最新的 end_date。
我一直在使用的代码在一定程度上有效,但我必须重复,如下面的代码所示。出于这个原因,我想我需要一些循环函数来完成一个过程,直到满足一个条件(end_date 晚于上一行的 end_date,或者 id 表示一个新的个人)。
library(dplyr)
## creates example dataframe
id <- c("A","A","A","A","A","A","A","A","A","A",
"A","A","A","B","B","B","B","B","B")
start_date <- as.Date(c("2004-01-23","2005-03-31","2005-03-31","2005-12-20","2005-12-20",
"2006-04-03","2007-11-26","2010-10-12","2011-08-08","2012-06-26",
"2012-06-26","2012-09-11","2012-10-03","2003-12-01","2006-02-28",
"2012-04-16","2012-08-30","2012-09-19","2012-09-28"))
end_date <- as.Date(c("2009-06-30","2005-09-17","2005-09-19","2005-12-30","2005-12-30",
"2006-06-19","2009-06-30","2010-11-05","2011-11-18","2012-06-26",
"2012-06-26","2012-09-11","2014-04-01","2012-08-29","2006-02-28",
"2012-04-16","2012-09-28","2013-10-11","2013-07-19"))
target_date <- as.Date(c(NA,"2009-06-30","2009-06-30","2009-06-30","2009-06-30","2009-06-30",
"2009-06-30","2009-06-30","2010-11-05","2011-11-18","2012-06-26",
"2012-06-26","2012-09-11",NA,"2012-08-29","2012-08-29","2012-08-29",
"2012-09-28","2013-10-11"))
df <- data.frame(id, start_date, end_date, target_date)
使用the method to flatten overlapping time periods 让我很接近,但我认为它需要在某处添加延迟来复制 target_date...
df <- df %>%
arrange(id, start_date) %>%
group_by(id) %>%
mutate(indx = c(0, cumsum(as.numeric(lead(start_date)) >
cummax(as.numeric(end_date)))[-n()])) %>%
group_by(id, indx) %>%
mutate(latest_date = max(end_date)) %>%
ungroup()
【问题讨论】:
-
恕我直言,这是David Arenburg's answer的变体
-
在此数据上使用该答案不会在一集中正确地将第 14 行合并到第 16 行。
2003-12-01 to 2012-04-16而不是您所期望的2003-12-01 to 2012-08-29。 -
@Uwe 指出并感谢您的链接,但正如 Wietze314 所说,这并不是理想的结果。我已经编辑了原始问题以反映这一点
-
或许,
df %>% group_by(id) %>% mutate(grp = cumsum(cummax(lag(as.integer(end_date), default = 0)) < as.integer(start_date))) %>% group_by(id, grp) %>% mutate(target_date_new = max(end_date)) %>% group_by(id) %>% mutate(target_date_new = lag(target_date_new)) -
@TimL 请您仔细检查一下您的预期结果。恕我直言,第 17 到 19 行形成另一个重叠时期 2012-08-30 到 2013-10-11,但您的预期结果显示三个单集。谢谢。