sum over past window-size dates per group

前端 未结 1 1987
说谎
说谎 2020-12-21 17:07

The problem is similar to How do I do a conditional sum which only looks between certain date criteria but slightly different and the answer from that does not fit into curr

相关标签:
1条回答
  • 2020-12-21 17:45

    Here's a (supposedly efficient) solution using the new non-equi joins and the by = .EACHI features in data.table (v1.9.8+)

    library(data.table) #v1.10.4
    
    ## Convert to a proper date class, and add another column in order to define the range
    setDT(input)[, c("Date", "Date2") := {
      Date = as.IDate(Date)
      Date2 = Date - 2L
      .(Date, Date2)
    }]
    
    ## Run a non-equi join against the unique Date/Group combination in input
    ## Sum the Scores on the fly
    ## You can ignore the second Date column 
    
    input[unique(input, by = c("Date", "Group")), ## This removes the dupes
          on = .(Group, Date <= Date, Date >= Date2), ## The join condition
          .(Score = sum(Score)), ## sum the scores
          keyby = .EACHI] ## Run the sum by each row in unique(input, by = c("Date", "Group"))
    
    #     Group       Date       Date Score
    #  1:     A 2017-04-01 2017-03-30     1
    #  2:     A 2017-04-02 2017-03-31     3
    #  3:     A 2017-04-04 2017-04-02     6
    #  4:     A 2017-04-07 2017-04-05     7
    #  5:     B 2017-04-02 2017-03-31     4
    #  6:     B 2017-04-05 2017-04-03     5
    #  7:     B 2017-04-08 2017-04-06     8
    #  8:     C 2017-04-02 2017-03-31     2
    #  9:     C 2017-04-03 2017-04-01     5
    # 10:     C 2017-04-06 2017-04-04     6
    # 11:     C 2017-04-09 2017-04-07     9
    
    0 讨论(0)
提交回复
热议问题