在包含矩阵的嵌套列表中应用函数

时间:2019-10-18 16:39:15

标签: r list matrix nested apply

此问题是Applying a function across nested list的后继。它处理向量列表的列表,而这个涉及矩阵列表的列表。

输入看起来像

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 个答案:

答案 0 :(得分:1)

Reduce函数是您的朋友,可以对列表进行按元素的操作。另一个相对棘手的部分是嵌套部分(需要两次lapply调用-如果您想要每个元素input的元素均值,我们可以立即调用Reduce)。

lapply(seq_along(input[[1]]), FUN = function(i){
  Reduce("+", lapply(input, `[[`, i)) / length(input)
})

答案 1 :(得分:0)

这将生成3D矩阵而不是2D矩阵列表,但它看起来比@ClancyStats提供的解决方案要快。

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