在 R 中按天重叠 start/end 日期范围聚合
Overlapping start/end date range aggregation by day in R
我搜索了很多问题,想看看是否能找到答案,但没有一个与我想做的很相符。所以我的数据看起来像这样:
ID Area Start End
1 9 2016-06-30 2016-07-07
2 9 2016-07-01 2016-07-04
3 8 2016-06-21 2016-06-28
4 8 2016-06-23 2016-06-25
5 8 2016-06-25 2016-06-30
我所做的是创建一个数据框,其中包含每个区域的整个日期范围,以及一个空白列来表示总天数。也许有更简单的方法来做到这一点,或者有一个包可以处理这种情况,但我希望能想出这样的东西:
Area Date Count
... 0
9 2016-06-30 1
9 2016-07-01 2
9 2016-07-02 2
9 2016-07-03 2
9 2016-07-04 2
9 2016-07-05 1
9 2016-07-06 1
9 2016-07-07 1
9 2016-07-08 0
... 0
8 2016-06-21 1
8 2016-06-22 1
8 2016-06-23 2
8 2016-06-24 2
8 2016-06-25 3
8 2016-06-26 2
8 2016-06-27 2
8 2016-06-28 2
8 2016-06-29 1
8 2016-06-30 1
... 0
似乎应该有一种简单的方法可以在 R 中处理这样的数组,但我还没有找到它。
提前致谢!
library(data.table)
dt = as.data.table(your_df) # or setDT to convert in-place
# convert dates to Dates (assuming they aren't)
dt[, Start := as.Date(Start, '%Y-%m-%d')]
dt[, End := as.Date(End, '%Y-%m-%d')]
# expand the dates, then aggregate
dt[, .(Date = seq(Start, End, by = 1), Area), by = ID][, .N, by = .(Date, Area)]
# Date Area N
#1: 2016-06-30 9 1
#2: 2016-07-01 9 2
#3: 2016-07-02 9 2
#4: 2016-07-03 9 2
#...
我搜索了很多问题,想看看是否能找到答案,但没有一个与我想做的很相符。所以我的数据看起来像这样:
ID Area Start End
1 9 2016-06-30 2016-07-07
2 9 2016-07-01 2016-07-04
3 8 2016-06-21 2016-06-28
4 8 2016-06-23 2016-06-25
5 8 2016-06-25 2016-06-30
我所做的是创建一个数据框,其中包含每个区域的整个日期范围,以及一个空白列来表示总天数。也许有更简单的方法来做到这一点,或者有一个包可以处理这种情况,但我希望能想出这样的东西:
Area Date Count
... 0
9 2016-06-30 1
9 2016-07-01 2
9 2016-07-02 2
9 2016-07-03 2
9 2016-07-04 2
9 2016-07-05 1
9 2016-07-06 1
9 2016-07-07 1
9 2016-07-08 0
... 0
8 2016-06-21 1
8 2016-06-22 1
8 2016-06-23 2
8 2016-06-24 2
8 2016-06-25 3
8 2016-06-26 2
8 2016-06-27 2
8 2016-06-28 2
8 2016-06-29 1
8 2016-06-30 1
... 0
似乎应该有一种简单的方法可以在 R 中处理这样的数组,但我还没有找到它。
提前致谢!
library(data.table)
dt = as.data.table(your_df) # or setDT to convert in-place
# convert dates to Dates (assuming they aren't)
dt[, Start := as.Date(Start, '%Y-%m-%d')]
dt[, End := as.Date(End, '%Y-%m-%d')]
# expand the dates, then aggregate
dt[, .(Date = seq(Start, End, by = 1), Area), by = ID][, .N, by = .(Date, Area)]
# Date Area N
#1: 2016-06-30 9 1
#2: 2016-07-01 9 2
#3: 2016-07-02 9 2
#4: 2016-07-03 9 2
#...