Сумма списка матриц в R - PullRequest
       21

Сумма списка матриц в R

1 голос
/ 03 августа 2020

Я пытаюсь собрать список матриц в список, а затем произвести суммирование внутри каждого списка. Ниже приведен простой пример кодов:

Допустим, если у меня есть 4 матрицы:

x1 <- matrix(1:9, nrow = 3)
x2 <- matrix(2:10, nrow = 3)
x3 <- matrix(3:11, nrow = 3)
x4 <- matrix(4:12, nrow = 3)

И я хочу поместить их в list() следующим образом:

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

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


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

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

А как мне произвести суммирование каждого элемента внутри list()? Например, желаемый результат будет следующим:

[[1]]
     [,1] [,2] [,3]
[1,]    3    9   15
[2,]    5   11   17
[3,]    7   13   19

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

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

Я пробовал использовать list(Reduce(`+`, x)), но он не работает.

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Поскольку вы хотите сохранить список верхнего уровня, используйте lapply:

lapply(x, function(l) if(is.list(l)) Reduce(`+`, l) else l)

#[[1]]
#     [,1] [,2] [,3]
#[1,]    3    9   15
#[2,]    5   11   17
#[3,]    7   13   19

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

#[[3]]
#     [,1] [,2] [,3]
#[1,]    4    7   10
#[2,]    5    8   11
#[3,]    6    9   12
1 голос
/ 03 августа 2020

Соответствующая purrr версия ответа @ RonakShah с map_if():

library(purrr)

map_if(x, is.list, reduce, `+`)

# [[1]]
#      [,1] [,2] [,3]
# [1,]    3    9   15
# [2,]    5   11   17
# [3,]    7   13   19
# 
# [[2]]
#      [,1] [,2] [,3]
# [1,]    3    6    9
# [2,]    4    7   10
# [3,]    5    8   11
# 
# [[3]]
#      [,1] [,2] [,3]
# [1,]    4    7   10
# [2,]    5    8   11
# [3,]    6    9   12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...