簡體   English   中英

使用 data.table 實現滾動窗口

[英]Implementing a rolling window using data.table

我可以通過反復“移動”我的數據,然后“逐行”總結來實現滾動窗口,但這看起來很麻煩,而且不容易推廣到不同的窗口大小。

#' Generate dummy data
library(data.table)
set.seed(42)
d <- data.table(id=rep(letters[1:2], each=5), time=rep(1:5,times=2), x=sample.int(10,10,replace=T))

數據如下所示:

id  time    x
a   1   10
a   2   10
a   3   3
a   4   9
a   5   7
b   1   6
b   2   8
b   3   2
b   4   7
b   5   8

現在在最后 2 次(對於每個 id)上滾動“最大值”。

#' Now you want to take the maximum of the previous 2 x values (by id)
#' I can do this by creating shifted lagged versions
d[, x.L1 := shift(x,1,type='lag'), by=id]
d[, x.L2 := shift(x,2,type='lag'), by=id]
d[, x.roll.max := max(x,x.L1,x.L2, na.rm=2), by=.(id,time)]

生成這個

id  time    x   x.L1    x.L2    x.roll.max
a   1   10  NA  NA  10
a   2   10  10  NA  10
a   3   3   10  10  10
a   4   9   3   10  10
a   5   7   9   3   9
b   1   6   NA  NA  6
b   2   8   6   NA  8
b   3   2   8   6   8
b   4   7   2   8   8
b   5   8   7   2   8

我假設有更好的方法。

所以我按照上面的@Franks suggestiong 去了 RcppRoll。

library(Rcpp)
d[, x.roll.max := roll_max(x, n=2L, align='right', fill=NA, na.rm=T), by=id]

而且我想我不應該嘗試在 data.table b/c 中完成這一切,這非常有效。

  id    time    x   x.roll.max
a   1   11  NA
a   2   12  12
a   3   4   12
a   4   10  10
a   5   8   10
a   6   7   8
b   1   9   NA
b   2   2   9
b   3   8   8
b   4   9   9
b   5   6   9
b   6   9   9

data.table v1.12.4 (2019 年 10 月 3 日)開始,可以使用frollapply函數滾動計算任意 R 函數:

library(data.table)

set.seed(42)
d <- data.table(id = rep(letters[1:2], each = 5), time = rep(1:5, times = 2), x = sample.int(10, 10, replace = T))
d[, x.roll.max := frollapply(x = x, n = 2, max, fill = NA, align = "right", na.rm = TRUE), by = id]

    id time  x x.roll.max
 1:  a    1  1         NA
 2:  a    2  5          5
 3:  a    3  1          5
 4:  a    4  9          9
 5:  a    5 10         10
 6:  b    1  4         NA
 7:  b    2  2          4
 8:  b    3 10         10
 9:  b    4  1         10
10:  b    5  8          8

我喜歡 Ulrich 的 TTR 包。 下面給你一個跑步最大值

TTR::runMax(d$x,2)

暫無
暫無

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

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