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

これで、最初の 2 つの obs に対して生成された NA があります。グループごとに。現在の obs のみを合計するように、代替手段の 1 つを調整する必要があります。(最後の 2 つの観測値) グループ インデックスが開始する場合 (位置 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 に答える