在函数中重置 cumprod
Reset cumprod in function
我正在尝试创建一个函数来计算滚动 cumprod
。该函数必须允许滑动 window。我得到以下数据:
set.seed(1)
library(zoo)
test1 <- data.table(time=as.yearmon(2000 + seq(0, 35)/12),a=rep(1:12,3),outcome1=rep(cumprod(1:12),3))
test2 <- data.table(time=as.yearmon(2000 + seq(0, 35)/12),a=rep(rnorm(36)))
test2[,outcome2:=c(NA,NA,cumprod(test2$a[3:8]),rep(NA,6),cumprod(test2$a[15:20]),rep(NA,6),cumprod(test2$a[27:32]),rep(NA,4))]
test1 简单地计算 12 个月的 cumprod,然后再计算一次,等等,以说明没有滑动的想法 window。 test2 显示了预期的计算:从示例性的 3 月到 8 月的 cumprod,然后是 6 个月的空window,然后在明年的 3 月开始下一次计算。
不久前,我尝试创建一个解决方案,为一个相当大的数据集手动计算起点和终点,但是循环内的函数太 slow/not 可行了。我相信 zoo
这可能会更快。我正在测试以下内容:
rollapply(c(1:12,1:12), width = 12, prod, partial = TRUE, align = "right")
..但到目前为止,无法在 12 个月后正确重置。此外,在 rollapply 中添加 window 和 by
是不可能的。感谢任何提示!
请注意,我的完整数据集并不总是从 1 月开始,因此编制索引并不那么容易。我想在这里避免使用面板以保持简单。
如果 ym
是 yearmon 向量,那么 as.integer(ym)
是年份,cycle(ym)
是月份,所以:
test1[, out := cumprod(a), by = as.integer(time)]
test2[, out := cumprod(ifelse(cycle(time) %in% 3:8, a, NA)),
by = .(as.integer(time), cycle(time) %in% 3:8)]
我正在尝试创建一个函数来计算滚动 cumprod
。该函数必须允许滑动 window。我得到以下数据:
set.seed(1)
library(zoo)
test1 <- data.table(time=as.yearmon(2000 + seq(0, 35)/12),a=rep(1:12,3),outcome1=rep(cumprod(1:12),3))
test2 <- data.table(time=as.yearmon(2000 + seq(0, 35)/12),a=rep(rnorm(36)))
test2[,outcome2:=c(NA,NA,cumprod(test2$a[3:8]),rep(NA,6),cumprod(test2$a[15:20]),rep(NA,6),cumprod(test2$a[27:32]),rep(NA,4))]
test1 简单地计算 12 个月的 cumprod,然后再计算一次,等等,以说明没有滑动的想法 window。 test2 显示了预期的计算:从示例性的 3 月到 8 月的 cumprod,然后是 6 个月的空window,然后在明年的 3 月开始下一次计算。
不久前,我尝试创建一个解决方案,为一个相当大的数据集手动计算起点和终点,但是循环内的函数太 slow/not 可行了。我相信 zoo
这可能会更快。我正在测试以下内容:
rollapply(c(1:12,1:12), width = 12, prod, partial = TRUE, align = "right")
..但到目前为止,无法在 12 个月后正确重置。此外,在 rollapply 中添加 window 和 by
是不可能的。感谢任何提示!
请注意,我的完整数据集并不总是从 1 月开始,因此编制索引并不那么容易。我想在这里避免使用面板以保持简单。
如果 ym
是 yearmon 向量,那么 as.integer(ym)
是年份,cycle(ym)
是月份,所以:
test1[, out := cumprod(a), by = as.integer(time)]
test2[, out := cumprod(ifelse(cycle(time) %in% 3:8, a, NA)),
by = .(as.integer(time), cycle(time) %in% 3:8)]