使用 data.table 在组内的最后 n 个观察值的滚动总和中避免 NA
Avoiding NA in rolling sums of last n observations within by groups using data.table
根据我了解到的威胁,下面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 个值的 windows 并处理异常。
有什么想法吗?
我不是 100% 确定我得到了你需要的东西,但 shift
函数默认留下 NA 值。您可以通过传递 fill
参数来更改该行为。在您的情况下,由于您要对数据求和,因此您可能想尝试使用 fill=0
:
set.seed( 123 )
x[, .(b, Reduce(`+`, shift(b, 0:2, fill=0))), by = a]
head
returns:
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
根据我了解到的
数据创建+计算滚动总和:
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 个值的 windows 并处理异常。
有什么想法吗?
我不是 100% 确定我得到了你需要的东西,但 shift
函数默认留下 NA 值。您可以通过传递 fill
参数来更改该行为。在您的情况下,由于您要对数据求和,因此您可能想尝试使用 fill=0
:
set.seed( 123 )
x[, .(b, Reduce(`+`, shift(b, 0:2, fill=0))), by = a]
head
returns:
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