我想通过data.frame中一个变量的累积总和等量聚合一个R data.frame。我用谷歌搜索了很多,但可能我不知道正确的术语来找到任何有用的东西。
假设我有这个data.frame:
> x <- data.frame(cbind(p=rnorm(100, 10, 0.1), v=round(runif(100, 1, 10))))
> head(x)
p v
1 10.002904 4
2 10.132200 2
3 10.026105 6
4 10.001146 2
5 9.990267 2
6 10.115907 6
7 10.199895 9
8 9.949996 8
9 10.165848 8
10 9.953283 6
11 10.072947 10
12 10.020379 2
13 10.084002 3
14 9.949108 8
15 10.065247 6
16 9.801699 3
17 10.014612 8
18 9.954638 5
19 9.958256 9
20 10.031041 7
我想将 x 减少到一个较小的 data.frame 中,其中每一行包含 p 的加权平均值,由 v 加权,对应于 v 的 n 个单位的数量。这种东西:
> n <- 100
> cum.v <- cumsum(x$v)
> f <- cum.v %/% n
> x.agg <- aggregate(cbind(v*p, v) ~ f, data=x, FUN=sum)
> x.agg$'v * p' <- x.agg$'v * p' / x.agg$v
> x.agg
f v * p v
1 0 10.039369 98
2 1 9.952049 94
3 2 10.015058 104
4 3 9.938271 103
5 4 9.967244 100
6 5 9.995071 69
第一个问题,我想知道上面的代码是否有更好(更有效的方法)。第二个更重要的问题是如何更正上面的代码以获得更精确的分桶。也就是说,中的每一行都x.agg
应该包含精确的100
单位v
,而不是像上面的情况那样近似。例如,第一行包含前 17 行的聚合,x
其中对应 98 个单位v
。下一行(第 18 行)包含 5 个单位,v
并且完全包含在下一个存储桶中。我想要实现的是将第 18 行的 2 个单元分配给第一个存储桶,将剩余的 3 个单元分配给下一个存储桶。
提前感谢您提供的任何帮助。