我有一个列表,其中包含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的新人,感谢任何帮助
答案 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