【问题标题】:Aggregate results by date intervals in R在 R 中按日期间隔汇总结果
【发布时间】:2019-12-13 18:24:15
【问题描述】:

我正在使用 R,并且我的数据位于 data.tables 对象上。我的数据格式为 ID、Date1、Date2、Row

对于每个 ID,我可以有多个条目,并且两个日期定义了一个时间间隔。

我希望能够按 id 和重叠时间间隔聚合所有条目。我确实知道如何使用 for 循环等,但我想知道是否有更好的方法。

例子:

data = data.table(
    id = c(1,1,1,2,2,3,3),
    Row = c(1,2,3,4,5,6,7),
    Date1 = c("2018-01-01", 
               "2018-01-05",
                "2018-01-21",
                "2018-01-01",
                "2018-01-15",
                "2018-01-01",
                "2018-01-19"),
    Date2 = c("2018-01-10", 
               "2018-01-20",
                "2018-01-22",
                "2018-01-31",
                "2018-01-19",
                "2018-01-15",
                "2018-01-23"))

所需的输出将是标识以下行组的内容: ((1,2),(3),(4,5),(6),(7)) ,这样我就可以生成一个新的ID,基于此分组。

【问题讨论】:

    标签: r datetime data.table grouping


    【解决方案1】:

    引用How to flatten / merge overlapping time periods并递归添加组号:

    s <- 0L
    data[, g := {
            r <- s + c(0L, cumsum(shift(Date1, -1L) > cummax(as.integer(Date2)))[-.N])
            s <- r[.N] + 1L
            r
        }, by=.(id)]
    

    输出:

       id Row      Date1      Date2 g
    1:  1   1 2018-01-01 2018-01-10 0
    2:  1   2 2018-01-05 2018-01-20 0
    3:  1   3 2018-01-21 2018-01-22 1
    4:  2   4 2018-01-01 2018-01-31 2
    5:  2   5 2018-01-15 2018-01-19 2
    6:  3   6 2018-01-01 2018-01-15 3
    7:  3   7 2018-01-19 2018-01-23 4
    

    数据:

    library(data.table)
    data = data.table(
        id = c(1,1,1,2,2,3,3),
        Row = c(1,2,3,4,5,6,7),
        Date1 = c("2018-01-01","2018-01-05","2018-01-21","2018-01-01","2018-01-15","2018-01-01","2018-01-19"),
        Date2 = c("2018-01-10","2018-01-20","2018-01-22","2018-01-31","2018-01-19","2018-01-15","2018-01-23"))
    cols <- c("Date1", "Date2")
    data[, (cols) := lapply(.SD, as.Date, format="%Y-%m-%d"), .SDcols=cols]
    

    【讨论】:

    • 完美。我拥有的数据集也很快。您能否评论一下它与我正在寻找的解决方案 foverlaps 的比较?
    • 我认为foverlaps 也可以,然后您可以使用网络来聚集群组
    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2019-03-08
    • 2018-04-02
    • 1970-01-01
    • 2019-07-10
    相关资源
    最近更新 更多