0

根据我了解到的这种威胁,以下 data.table 中变量 b 的滚动总和可以实现如下:

数据创建+计算滚动总和:

    x <- data.table(a = sample(letters[1:3], 100, replace = TRUE), b = runif(100))
    setorder(x, a)

    # alternative 1
    x[, .(b, Reduce(`+`, shift(b, 0:2))), by = a]
    # alternative 2
    x[, .(b, stats::filter(b, rep(1, 3), sides = 1)), by = a]

当前 + 所需输出:

     a           b        V2   V2_desired
  1: a 0.457665568        NA   0.457665568
  2: a 0.752555834        NA   1.210221
  3: a 0.864672124 2.0748935   2.0748935
  4: a 0.542168656 2.1593966   2.1593966
  5: a 0.197962875 1.6048037   1.6048037

现在有为前两个 obs 生成的 NA。在每个按组。我需要调整其中一种选择以仅对当前 obs 求和。(最后两个 obs。)在组索引开始的情况下(在位置 2)。这应该是可概括的,以便我可以考虑最后 n 个值的窗口并处理异常。

任何想法?

4

1 回答 1

1

我不是 100% 确定我得到了你需要的东西,但默认情况下,该shift函数会留下 NA 值。您可以通过传递fill参数来更改该行为。在您的情况下,由于您正在对数据求和,您可能想尝试使用fill=0

set.seed( 123 )
x[, .(b, Reduce(`+`, shift(b, 0:2, fill=0))), by = a]

head返回:

   a         b       V2
1: a 0.5999890 0.599989
2: a 0.8903502 1.490339
3: a 0.7205963 2.210935
4: a 0.5492847 2.160231
5: a 0.9540912 2.223972
6: a 0.5854834 2.088859
于 2016-11-03T13:32:25.167 回答