将数据帧重新整形为平均值堆栈

时间:2014-04-12 17:51:02

标签: r reshape

我已经掌握了一些我需要转换i 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。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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