簡體   English   中英

按日期間隔匯總結果

[英]Aggregate results by date intervals in R

我正在使用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)),這樣我就可以基於在這個分組上。

參考如何展平/合並重疊的時間段並遞歸添加組號:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM