将矩阵变换为R中的累积行平均矩阵

时间:2014-03-11 01:10:44

标签: r matrix average linear-algebra

我有一个预测矩阵。每行是对个体的预测,每列是来自特定模型的预测。我想转换它,所以第一列是第一个模型的预测,第二列是第一个第二个模型的预测的平均值

因此,转换后的矩阵将容纳原始矩阵中观测值的运行累积平均值。

我有一种感觉cumsum可以与apply函数一起使用来实现这一点,但我不确定如何得到一个优雅的结果(用于大型矩阵)。

谢谢!

2 个答案:

答案 0 :(得分:2)

试试这个:

# Initialize a testing matrix
(m <- matrix(1:12, 3, 4))

     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

# Calculate cumulative average by column for each row
t(apply(m, 1, cumsum) / seq(ncol(m)))

     [,1] [,2] [,3] [,4]
[1,]    1  2.5    4  5.5
[2,]    2  3.5    5  6.5
[3,]    3  4.5    6  7.5

这基本上采用逐行累积求和,然后除以表示列索引的循环数组。

编辑:如果您正在使用数据框执行类似操作,使用data.table和reshape2包的方法可能很有用:

library(data.table)
dt <- data.table(m)
# Add row number to melt by
dt[, row := seq(nrow(dt))]

library(reshape2)
dt.molten <- data.table(melt(dt, "row"))
# Row-level format
dt.molten[, cumsum(value) / as.numeric(variable), "row"]

    row  V1                                                                                          
 1:   1 1.0                                                                                          
 2:   1 2.5                                                                                          
 3:   1 4.0                                                                                          
 4:   1 5.5                                                                                          
 5:   2 2.0                                                                                          
 6:   2 3.5                                                                                          
 7:   2 5.0                                                                                          
 8:   2 6.5                                                                                          
 9:   3 3.0                                                                                          
10:   3 4.5                                                                                          
11:   3 6.0
12:   3 7.5

答案 1 :(得分:1)

使用建议的cumsumapply

mat <- matrix(1:24,ncol=6)
mat
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1    5    9   13   17   21
#[2,]    2    6   10   14   18   22
#[3,]    3    7   11   15   19   23
#[4,]    4    8   12   16   20   24

t(apply(mat,1,cumsum)/(seq_len(ncol(mat))))
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1    3    5    7    9   11
#[2,]    2    4    6    8   10   12
#[3,]    3    5    7    9   11   13
#[4,]    4    6    8   10   12   14