用 adative window 计算 data.table 中的滚动最小值

Compute the rolling minimum in data.table with adative window

我想通过自适应滚动计算每个组的滚动最小值 window。我目前使用 frollapply 完成此操作,但我得到 NA 直到有足够的行来满足 window 大小。

我需要 window 自适应,这样如果 window 是 3,那么在第 1 行和第 2 行,window 也将是 1 和 2,然后是 3对于剩余的行。

d = structure(list(x = c(10, 4, 8, 1, 2, 3, 8, 9, 10),
                   grp = c(rep("a", 6), rep("b", 3))),
              row.names = c(NA, -8L), class = c("data.table", "data.frame"))

window <- 4
d[, n := {x = 1:.N; y = .N; z = fifelse(x > window, window, x)}, by = .(grp)]

d[, x1 := frollmean(x, n, adaptive=TRUE), by = .(grp)]
d[, x2 := frollapply(x, n, FUN = min), by = .(grp)]
d[, x3 := frollapply(x, n = 4, FUN = min), by = .(grp)]

在上面的示例中,window 大小是 4n 是自适应 window。 x1 中的平均值使用的是 window,我需要同样的东西,但最低限度。当我尝试在 x2 中使用它时,它只是 returns 在 x 中的相同值。 如果我在 frollapply 中使用 n=4 然后我得到 NA 直到有足够的行来满足 window 长度。

fcoalesce()

快速介绍一下:

d[, xx := fcoalesce(frollapply(x, n = window, FUN = min), cummin(x)), by = grp]
# or 
d[, xx := fcoalesce(frollapply(x, n = window:1L, FUN = min)), by = grp]


    x grp xx
1: 10   a 10
2:  4   a  4
3:  8   a  4
4:  1   a  1
5:  2   a  1
6:  3   a  1
7:  8   b  8
8:  9   b  8
9: 10   b  8