【问题标题】:Overlapping start/end date range aggregation by day in RR中按天重叠的开始/结束日期范围聚合
【发布时间】:2016-11-23 22:26:08
【问题描述】:

我已经搜索了很多问题,看看是否能找到答案,但没有什么能完全符合我想要做的。所以我的数据看起来像这样:

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 中处理这样的数组,但我还没有找到。

提前致谢!

【问题讨论】:

    标签: r aggregation date-range


    【解决方案1】:
    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
    #...
    

    【讨论】:

    • 只是在没有事件的情况下错过了 0 的计数。但是这个答案解决了问题的要点。
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多