[英]R data.table : rolling lag sum for previous 3 days by group
我目前正在 data.table 中工作 R 並且正在尋找一種簡單的方法來實現滾動滯后和。 我可以找到有關滯后的帖子和有關各種 sum 函數的帖子,但沒有成功找到一個以我希望實現它的方式(回滾 3 天)將 sum 和 lag 結合在一起的帖子。
我有一個類似於以下的數據集 -
id agedays diar
1 1 1
1 2 0
1 3 1
1 4 1
1 5 0
1 6 0
1 7 0
1 8 1
1 9 1
1 10 1
3 2 0
3 5 0
3 6 0
3 8 1
3 9 1
4 1 0
4 4 0
4 5 0
4 6 1
4 7 0
我想創建一個變量“diar_prev3”,它保存當前 agedays 值之前過去 3 天的 diar 滾動總和。 對於 agedays < 4 的行,Diar_prev3 將為 NA 數據集如下所示:
id agedays diar diar_prev3
1 1 1 NA
1 2 0 NA
1 3 1 NA
1 4 1 2
1 5 0 2
1 6 0 2
1 7 0 1
1 8 1 0
1 9 1 1
1 10 1 2
3 2 0 NA
3 5 0 0
3 6 0 0
3 8 1 0
3 9 1 1
4 1 0 NA
4 4 0 0
4 5 0 0
4 6 1 0
4 7 0 1
我已經嘗試了基本的滯后 function,但我不確定如何通過包含滾動總和 function 來實現這一點。 有沒有人推薦使用任何功能來完成此操作?
****已編輯以修復 ID==2 的錯誤
我不明白邏輯; 它似乎不是id
,否則 id==2 的結果沒有意義 - 但是 id==3 和 4 發生了什么?
原則上,您可以通過 ID 或不通過 ID 執行以下操作:
library(data.table)
library(RcppRoll)
DT <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L,
3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L),
agedays = c(1L, 2L,
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 2L, 5L, 6L, 8L, 9L, 1L, 4L,
5L, 6L, 7L), diar = c(1L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L,
0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 0L)),
class = "data.frame", row.names = c(NA, -20L))
setDT(DT)
DT[, diar_prev3 := ifelse(agedays < 4, NA, RcppRoll::roll_sum(lag(diar, 1), n=3L, fill=NA, align = "right"))][]
#> id agedays diar diar_prev3
#> 1: 1 1 1 NA
#> 2: 1 2 0 NA
#> 3: 1 3 1 NA
#> 4: 1 4 1 2
#> 5: 1 5 0 2
#> 6: 2 6 0 1
#> 7: 2 7 0 0
#> 8: 2 8 1 1
#> 9: 2 9 1 2
#> 10: 2 10 1 3
#> 11: 3 2 0 NA
#> 12: 3 5 0 1
#> 13: 3 6 0 0
#> 14: 3 8 1 1
#> 15: 3 9 1 2
#> 16: 4 1 0 NA
#> 17: 4 4 0 1
#> 18: 4 5 0 0
#> 19: 4 6 1 1
#> 20: 4 7 0 1
DT[, diar_prev3 := ifelse(agedays < 4, NA, RcppRoll::roll_sum(lag(diar, 1), n=3L, fill=NA, align = "right")), by=id][]
#> id agedays diar diar_prev3
#> 1: 1 1 1 NA
#> 2: 1 2 0 NA
#> 3: 1 3 1 NA
#> 4: 1 4 1 2
#> 5: 1 5 0 2
#> 6: 2 6 0 NA
#> 7: 2 7 0 NA
#> 8: 2 8 1 1
#> 9: 2 9 1 2
#> 10: 2 10 1 3
#> 11: 3 2 0 NA
#> 12: 3 5 0 NA
#> 13: 3 6 0 0
#> 14: 3 8 1 1
#> 15: 3 9 1 2
#> 16: 4 1 0 NA
#> 17: 4 4 0 NA
#> 18: 4 5 0 0
#> 19: 4 6 1 1
#> 20: 4 7 0 1
由reprex package (v0.3.0) 於 2020 年 7 月 20 日創建
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.