假设我有一个如下所示的数据帧:
df <- data.frame(group = c("a", "a", "b"),
start = as.Date(c("2018-01-01", "2018-09-01", "2018-02-01")),
end = as.Date(c("2018-02-15", "2018-12-31", "2018-03-30")))
group start end
a 2018-01-01 2018-02-15
a 2018-09-01 2018-12-31
b 2018-02-01 2018-03-30
我希望获得以下预期输出:
output <- data.frame(group = c("a", "a", "a", "a", "a", "a", "b", "b"),
start = as.Date(c("2018-01-01", "2018-02-01", "2018-09-01",
"2018-10-01", "2018-11-01", "2018-12-01",
"2018-02-01", "2018-03-01")),
end = as.Date(c("2018-01-31", "2018-02-15", "2018-09-30",
"2018-10-31", "2018-11-30", "2018-12-31",
"2018-02-28", "2018-03-30")))
group start end
a 2018-01-01 2018-01-31
a 2018-02-01 2018-02-15
a 2018-09-01 2018-09-30
a 2018-10-01 2018-10-31
a 2018-11-01 2018-11-30
a 2018-12-01 2018-12-31
b 2018-02-01 2018-02-28
b 2018-03-01 2018-03-30
对于序列中的每个月,我想得到一个单独的行,如果后者>月的开始日期或月的开始日期和2)的结束日期,则由1)序列的开始日期分隔 . 后者>序列的结束日期或序列的结束日期 .
关于如何做到这一点的任何想法?
3 回答
data.table解决方案
我最喜欢的这类问题的首选武器是
data.table
非常快foverlaps
基准
与@AntoniosK的tidyverse解决方案相比(效果更好,更具可读性;-)),
foverlaps
在50%的时间内完成工作这是另一种可能的
data.table
方法:输出: