将函数应用于列表列表
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)))
我有一个长度为 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)))