2014-04-12 79 views
2

我已经得到我的手对一些数据的堆栈我需要改变我R的数据是这样的:重塑数据帧到平均值

df <- data.frame(time = 1:100, value = runif(100, min = -20, max = 20)) 

我想什么做的,是改造数据转换为包含运行方式的矩阵,最多5个时间段。这很难解释,但一个例子就是这样。

原始数据

time value 
1  2 
2  7 
3  8 
4  19 
5  -5 
6 -15 
7  4 
8  6 
9  12 
10 20 

而结果将是该矩阵/数据帧。

time mean-value(5)  mean-value(4) mean-value(3) mean-value(2) Mean-value(1) 
1  (2+7+8+19-5)/5  (2+7+8+19)/4  (2+7+8)/3  (2+7)/2   2/1 
2  (7+8+19-5-15)/5 (7+8+19-5)/4  (7+8+19)/3  (7+8)/2   7/1 
3  (8+19-5-15+4)/5 ..... 
.... 
.... 
96 na     numbers/4   numbers/3  numbers/2  numbers/1 
97 na     na    numbers/3  .....      

我在一个完整的损失,我试过一些重塑,但它没有得到正确的。最后,如果没有足够的时间观测来计算,它也应该只给NA。

+0

你看过这个答案吗? http://stats.stackexchange.com/questions/3051/mean-of-a-sliding-window-in-r – infominer

回答

2

适应的answer here,你可以得到你想要的东西很容易使用filter

sapply(5:1, function(z) rev(filter(rev(df$value), rep(1/z,z), sides=1))) 

这里有您的示例数据结果:

 [,1] [,2]  [,3] [,4] [,5] 
[1,] 6.2 9.00 5.6666667 4.5 2 
[2,] 2.8 7.25 11.3333333 7.5 7 
[3,] 2.2 1.75 7.3333333 13.5 8 
[4,] 1.8 0.75 -0.3333333 7.0 19 
[5,] 0.4 -2.50 -5.3333333 -10.0 -5 
[6,] 5.4 1.75 -1.6666667 -5.5 -15 
[7,] NA 10.50 7.3333333 5.0 4 
[8,] NA NA 12.6666667 9.0 6 
[9,] NA NA   NA 16.0 12 
[10,] NA NA   NA NA 20 
3

以下是使用data.table的一种方法。这个答案可能有很大的改进,甚至完全可以得到更好的答案。

获取data.table:

require(data.table) ## >= 1.9.2 
dat <- read.table(header=TRUE, text="time value 
     1  2 
     2  7 
     3  8 
     4 19 
     5 -5 
     6 -15 
     7  4 
     8  6 
     9 12 
     10 20") 

# convert to `data.table` by reference: 
setDT(dat) 

生成各种手段:

N = 5L 
grp = seq_len(N); 
ans = dat[, { 
       ix = .I:(.I+N-1L); 
       vx = cumsum(dat$value[ix]); 
       list(grp=grp, val=rev(vx/grp)) 
      }, by=time] 

检查?data.table阅读有关.I(它是一个包含对应于每个dat行号的特殊变量组)。

它转换为宽幅:

dcast.data.table(ans, time ~ grp, value.var="val") 

    time 1  2   3  4 5 
1: 1 6.2 9.00 5.6666667 4.5 2 
2: 2 2.8 7.25 11.3333333 7.5 7 
3: 3 2.2 1.75 7.3333333 13.5 8 
4: 4 1.8 0.75 -0.3333333 7.0 19 
5: 5 0.4 -2.50 -5.3333333 -10.0 -5 
6: 6 5.4 1.75 -1.6666667 -5.5 -15 
7: 7 NA 10.50 7.3333333 5.0 4 
8: 8 NA NA 12.6666667 9.0 6 
9: 9 NA NA   NA 16.0 12 
10: 10 NA NA   NA NA 20