2014-04-12 114 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