【问题标题】:Applying a function across nested list containing matrices在包含矩阵的嵌套列表中应用函数
【发布时间】:2019-10-18 16:39:15
【问题描述】:

这个问题是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)

【问题讨论】:

    标签: r list matrix nested apply


    【解决方案1】:

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

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

    【讨论】:

    • 您的解决方案是正确的。我已经更新了我的问题。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      相关资源
      最近更新 更多