我想通过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 个单元分配给下一个存储桶。
提前感谢您提供的任何帮助。