我有一个预测矩阵。每行是对个体的预测,每列是来自特定模型的预测。我想转换它,所以第一列是第一个模型的预测,第二列是第一个和第二个模型的预测的平均值等
因此,转换后的矩阵将容纳原始矩阵中观测值的运行累积平均值。
我有一种感觉cumsum可以与apply函数一起使用来实现这一点,但我不确定如何得到一个优雅的结果(用于大型矩阵)。
谢谢!
答案 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)
使用建议的cumsum
和apply
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