1

我有一个名为 abc 的数据框,我正在使用rollapply. 以下代码有效:

forecast <- rollapply(abc, width=12, FUN=mean, align = "right", fill=NA)

现在,我想做同样的事情,宽度是可变的,即第一个月,它会是空的,第二个月,第一个月的价值就会到来。对于第三个月,它将是(第一个月+第二个月/2),即对于第 i 个月,如果i<=12,该值将是(sum(1:i-1)/(i-1))并且i>=12它将是过去 12 个月的平均值,如forecast. 请帮忙。

4

1 回答 1

4

以下是一些方法:

1) 部分=真

n <- length(x)
c(NA, rollapplyr(x, 12, mean, partial = TRUE)[-n])

注意末尾的 r rollapplyr

2) 宽度作为列表width参数rollapply可以是一个列表,这样第 i 个列表元素是用于第 i 个滚动计算的偏移量的向量。如果我们指定 partial=TRUE,那么超出向量末尾的偏移量将被忽略。如果我们只在列表中指定一个元素,它将被回收:

rollapply(x, list(-seq(12)), mean, partial = TRUE, fill = NA)

2a)而不是回收,取决于partial我们可以写出来。在这里,我们想要width <- list(numeric(0), -1, -(1:2), -(1:3), ..., -(1:12), ..., -(1:12))可以这样计算:

width <- lapply(seq_along(x), function(x) -seq_len(min(12, x-1)))
rollapply(x, width, mean)

如果您想稍微修改规范,这将主要是有趣的,因为它非常灵活。

注意:后来在评论中,发布者要求使用相同的滚动平均值,但不能滞后。那只是:

rollapplyr(x, 12, mean, partial = TRUE)

注意末尾的 r rollapplyr

更新一些改进和其他解决方案。

于 2014-07-08T10:47:07.833 回答