Суммирование по элементам списка, чьи подэлементы имеют одинаковые имена - PullRequest
2 голосов
/ 13 марта 2020

Список для воспроизведения минимального рабочего примера

Предположим, у меня есть такой список

a <- list(
    list(
        a=matrix(c(1, 2)), 
        b=matrix(c(1,2,1,2), ncol=2)),
    list(
        a=matrix(c(3, 5)), 
        b=matrix(c(5,2,7,1), ncol=2))
)

По сути, он выглядит так

[[1]]
[[1]]$a
     [,1]
[1,]    1
[2,]    2

[[1]]$b
     [,1] [,2]
[1,]    1    1
[2,]    2    2


[[2]]
[[2]]$a
     [,1]
[1,]    3
[2,]    5

[[2]]$b
     [,1] [,2]
[1,]    5    7
[2,]    2    1

Желаемый вывод

Я бы хотел, чтобы для каждого элемента a была найдена сумма по правильному имени. В этом случае я бы хотел иметь вывод, похожий на этот (хотя это и не обязательно должен быть список)

$a
     [,1]
[1,]    4
[2,]    7

$b
     [,1] [,2]
[1,]    6    8
[2,]    4    3

Каков самый быстрый способ получить это вывод? Я могу сделать это с for-l oop, но я уверен, что должен быть лучший способ.

Ответы [ 2 ]

3 голосов
/ 13 марта 2020

Используйте transpose для обмена внутренними и внешними списками. Затем используйте map и reduce для суммирования.

library(purrr)

a %>%
  transpose %>%
  map(~ reduce(., `+`))

# $a
#      [,1]
# [1,]    4
# [2,]    7
# 
# $b
#      [,1] [,2]
# [1,]    6    8
# [2,]    4    3
1 голос
/ 13 марта 2020

В базе R вы могли бы сделать.

Map(function(i) a[[1]][[i]] + a[[2]][[i]], el(Map(names, a)))

Или, в более общем смысле

sapply(el(Map(names, a)), function(i) Reduce(`+`, mapply(`[`, a, i)))
# $a
#      [,1]
# [1,]    4
# [2,]    7
# 
# $b
#      [,1] [,2]
# [1,]    6    8
# [2,]    4    3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...