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