用 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 大小是 4
,n
是自适应 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
我想通过自适应滚动计算每个组的滚动最小值 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 大小是 4
,n
是自适应 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