for循环列表中的矩阵和R中所有矩阵的平均值

时间:2018-02-05 12:04:58

标签: r

我有一个列表,其中包含1到10的矩阵,每个矩阵代表一年,所以我必须在M1和M2之间生成矩阵MG,也在M2 et M3,M3和M4之间生成....

因此,例如计算M1和M2之间的矩阵,我必须在计算后执行此操作:

L=c(rowSums(Matrix1)) #(sum of each matrix'row)
K=c(rowSums(MatriX2))

G=L+K 

SM=Matrix1+Matrix2  #( sum of the two matrix)

MG=sweep(SM,1,G,FUN = "/") #( div SM by G )

output=list(MG)

并在最后生成一个矩阵,用于计算列表中包含的所有MG的平均值。

我还是R的新人,感谢任何帮助

2 个答案:

答案 0 :(得分:0)

将几个矩阵放入列表中是件好事,我们将使用Lapply创建i-1 MG矩阵列表,使用您的代码(我没有检查它,只是将其复制到功能)。

your_list <- list(M1 = as.matrix(iris[1:5,1:4]),
                  M2 = as.matrix(iris[6:10,1:4]),
                  M3 = as.matrix(iris[11:15,1:4]))  

your_function <- function(Matrix1,Matrix2){
  L=c(rowSums(Matrix1)) #(sum of each matrix'row)
  K=c(rowSums(Matrix2))
  G=L+K 
  SM=Matrix1+Matrix2  #( sum of the two matrix)
  MG=sweep(SM,1,G,FUN = "/") #( div SM by G )
}

MG_list <- lapply(1:(length(your_list)-1),function(i) your_function(your_list[[i]],your_list[[i+1]]))

然后,为了对所有这些矩阵进行平均,我们首先将它们相加,然后除以矩阵的数量,参见?Reduce以了解它是如何工作的:

avg_MG <- Reduce(`+`,MG_list) / length(MG_list)

答案 1 :(得分:0)

@Moody_Mudskippers方法的替代方法是使用Map

示例数据:

set.seed(1)
matlist <- list(matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
                matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
                matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
                matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
                matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
                matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
                matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
                matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
                matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2),
                matrix(sample(1:10, 4, replace = T), nrow = 2, ncol = 2))
names(matlist) <- paste0("M", 1:10)

生成连续扫描矩阵的输出:

output <- Map(function(x, y){
  sweep(x+y, 1, rowSums(x)+rowSums(y), FUN = "/")
}, matlist[-10], matlist[-1])

计算方法:

Reduce(`+`, output) / length(output)

          [,1]      [,2]
[1,] 0.4984006 0.5015994
[2,] 0.4730748 0.5269252