簡體   English   中英

R data.table:按組滾動前 3 天的滯后總和

[英]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.

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