将函数应用于列表列表

Apply function to a list of lists

我有一个长度为 100 的列表。每个条目本身就是一个包含 31 个矩阵的列表,矩阵有 10 行和 5 列。

>length(dati_fault)
[1] 100
> length(dati_fault[[1]])
[1] 31

我应该得到 100 个变量的平均值,总结列表中每个元素的 31 个矩阵

media_1<-list()
for(i in nrow(dati_fault)){
  for(j in nrow(dati_fault[[i]]))
  media_1[[i]]<-lapply(dati_fault, colMeans(j))
  
}
media_1

但我什么也没得到,因为 media_1 列表仍然是空的

您不需要 for 循环来执行此操作。您可以直接使用 lapply:

lapply(dati_fault, \(x) colMeans(do.call(rbind, x)))

这会执行以下操作:对于 dati_fault 的每个条目(即 31 个矩阵的每个子列表),这些矩阵被绑定在一起(使用 rbind)成一个具有 310 行和 5 列的矩阵.然后,colMeans 应用于此矩阵。

如果您不熟悉匿名函数的 shorthand 表示法(即 \(x)),您可以阅读 here.

示例数据

dati_fault <- lapply(1:100, function(x) {
  rep(list(matrix(sample(50, replace = T), nrow = 10, ncol = 5)), 31)
})

案例 1:计算每个矩阵的均值

# to get the colMeans of each matrix (100 * 31 mean vectors)
lapply(dati_fault, function(x) lapply(x, colMeans))

情况2:计算同一列表中所有矩阵的平均值

# to get the colMeans of all 31 matrixes together (100 mean vectors) 
lapply(dati_fault, function(x) colMeans(do.call(rbind, x)))