首页 文章

使用data.table在组内的最后n个观测值的滚动总和中避免NA

提问于
浏览
0

根据this威胁,我了解到,以下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

现在有前两个生成的NA . 在每个小组中 . 我需要调整其中一个替代方案,只计算当前的阻值 . 在组指数开始的情况下(位于第2位)的情况(最后两个障碍) . 这应该是可推广的,这样我可以考虑最后n个值的窗口并处理异常 .

任何的想法?

1 回答

  • 1

    我'm not 100% sure I'm得到你需要的东西,但 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
    

相关问题