此问题是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)
答案 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)