R 滚动连接&x2B;不破坏记忆地求和

R 滚动连接&x2B;不破坏记忆地求和,r,data.table,R,Data.table,我的问题最好用一个例子来解释 安装程序 库(data.table) IDsUgh。发帖5分钟后,我意识到了解决方案 # get the first row per unique (id, val_cmltv_max) changes <- foo[foo[, .I[1L], by = list(id, val_cmltv_max)]$V1] # For each id, get the change in val_cmltv_max # Would use shift() here b

我的问题最好用一个例子来解释

安装程序
库(data.table)

IDsUgh。发帖5分钟后,我意识到了解决方案

# get the first row per unique (id, val_cmltv_max)
changes <- foo[foo[, .I[1L], by = list(id, val_cmltv_max)]$V1]

# For each id, get the change in val_cmltv_max 
# Would use shift() here but it's slow
# changes[, val_cmltv_max_prev := shift(val_cmltv_max, type = "lag", fill = 0), by = id]
changes[, val_cmltv_max_prev := c(0, head(val_cmltv_max, -1)), by = id]
changes[, change := val_cmltv_max - val_cmltv_max_prev]

# aggregate changes by time
changes <- changes[, list(change = sum(change)), by = time]

# insert into bar and cumsum
bar[, change := 0]
bar[changes, change := i.change, on = "time"]
bar[, sum_val_cmltv_max := cumsum(change)]
#获取每个唯一项的第一行(id,val\u cmltv\u max)
变化
temp <- CJ(time = bar$time, id = sort(unique(foo$id)))
temp2 <- foo[temp, on = c("id", "time"), roll = TRUE]
result <- temp2[, list(sum_val_cmltv_max = sum(val_cmltv_max, na.rm = T)), by = time]

> result
          time sum_val_cmltv_max
     1:      1              0.00
     2:      2              0.00
     3:      3              0.00
     4:      4              0.00
     5:      5              0.00
    ---                         
999995: 999995              4.95
999996: 999996              4.95
999997: 999997              4.95
999998: 999998              4.95
999999: 999999              4.95
# get the first row per unique (id, val_cmltv_max)
changes <- foo[foo[, .I[1L], by = list(id, val_cmltv_max)]$V1]

# For each id, get the change in val_cmltv_max 
# Would use shift() here but it's slow
# changes[, val_cmltv_max_prev := shift(val_cmltv_max, type = "lag", fill = 0), by = id]
changes[, val_cmltv_max_prev := c(0, head(val_cmltv_max, -1)), by = id]
changes[, change := val_cmltv_max - val_cmltv_max_prev]

# aggregate changes by time
changes <- changes[, list(change = sum(change)), by = time]

# insert into bar and cumsum
bar[, change := 0]
bar[changes, change := i.change, on = "time"]
bar[, sum_val_cmltv_max := cumsum(change)]