Применение функции к вложенному списку, содержащему матрицы - PullRequest
1 голос
/ 18 октября 2019

Этот вопрос является преемником Применение функции для вложенного списка . Принимая во внимание, что он имеет дело со списком списков векторов, этот касается списка списков матриц.

Вход выглядит как

set.seed(42L)
input <- replicate(3, replicate(4, matrix(rnorm(25), nrow=5), simplify=FALSE), simplify=FALSE)

Я хочу вычислить среднее значение соответствующие записи из внешнего списка . Конечно, я могу использовать цикл for, но должен быть другой способ, который быстрее, лаконичнее и понятнее?

result <- replicate(4, matrix(0, nrow=5, ncol=5), simplify=FALSE)
for (i in 1:3) {
    for (j in 1:4) {
        for (k in 1:5) {
            for (l in 1:5) {
                result[[j]][k, l] <- result[[j]][k, l] + input[[i]][[j]][k, l]
            }
        }
    }
}
result <- lapply(result, function(x) x / 3)

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Функция Reduce - ваш друг для выполнения поэлементных операций над списками. Единственная другая относительно сложная часть - это вложенная часть (которая требует двух вызовов lapply - если вы хотите получить элементарное среднее для каждого элемента input, мы могли бы немедленно вызвать Reduce).

lapply(seq_along(input[[1]]), FUN = function(i){
  Reduce("+", lapply(input, `[[`, i)) / length(input)
})
0 голосов
/ 18 октября 2019

Это приведет к 3D-матрице вместо списка 2D-матриц, но, похоже, будет быстрее, чем решение, предоставляемое @ ClancyStats.

apply(aperm(array(unlist(input), c(5, 5, 4, 3)), c(3, 4, 1, 2)), c(1, 3, 4), mean)
...