Суммируйте список матриц [дубликат]
этот вопрос уже есть ответ здесь:
У меня есть список, где каждый элемент матрицы 5*5. Например
[[1]]
V1 V2 V3 V4 V5
[1,] 0.000000 46.973700 21.453500 338.547000 10.401600
[2,] 43.020500 0.000000 130.652000 840.526000 56.363700
[3,] 12.605600 173.238000 0.000000 642.075000 19.628100
[4,] 217.946000 626.368000 481.329000 0.000000 642.341000
[5,] 217.946000 626.368000 481.329000 0.000000 642.341000
[[2]]
V1 V2 V3 V4 V5
[1,] 0.000000 47.973700 21.453500 338.547000 10.401600
[2,] 143.020500 0.000000 130.652000 840.526000 56.363700
[3,] 312.605600 17.238000 0.000000 642.075000 19.628100
[4,] 17.946000 126.368000 481.329000 0.000000 642.341000
[5,] 217.946000 626.368000 481.329000 0.000000 642.341000
...
Как я могу использовать функцию apply-like для суммирования матрицы [1] в [n] и возвращать матрицу 5*5 в результате (каждый элемент является суммой соответствующие элементы в каждой матрице в списке) ?
4 ответа:
использовать
Reduce
.## dummy data .list <- list(matrix(1:25, ncol = 5), matrix(1:25, ncol = 5)) Reduce('+', .list) ## [,1] [,2] [,3] [,4] [,5] ## [1,] 2 12 22 32 42 ## [2,] 4 14 24 34 44 ## [3,] 6 16 26 36 46 ## [4,] 8 18 28 38 48 ## [5,] 10 20 30 40 50
Я думаю, что ответ @mnel является более эффективным, но это другой подход:
apply(simplify2array(.list), c(1,2), sum) [,1] [,2] [,3] [,4] [,5] [1,] 2 12 22 32 42 [2,] 4 14 24 34 44 [3,] 6 16 26 36 46 [4,] 8 18 28 38 48 [5,] 10 20 30 40 50
вы могли бы вы
do.call
с некоторым monkeying вокруг, но он теряет свое красноречие:.list <- list(matrix(1:25, ncol=5), matrix(1:25,ncol=5), matrix(1:25,ncol=5)) x <- .list[[1]] lapply(seq_along(.list)[-1], function(i){ x <<- do.call("+", list(x, .list[[i]])) }) x
есть еще более простой способ:
matlist <- list(matrix(1:25, ncol=5), matrix(1:25,ncol=5)) combmat <- matlist[[1]]+matlist[[2]] > combmat [,1] [,2] [,3] [,4] [,5] [1,] 2 12 22 32 42 [2,] 4 14 24 34 44 [3,] 6 16 26 36 46 [4,] 8 18 28 38 48 [5,] 10 20 30 40 50
хотя я думаю, что использование уменьшить это лучший способ пойти.