另一个选项打开了其他几个统计选项。
如果您将 40x20 data.frames 列表转换为 40x20x1000 数组,您可以 apply 穿过每个 40x20“管”钻入第 3 维。
使用三个 2x4 矩阵的样本:
set.seed(42)
lst <- lapply(1:3, function(ign) matrix(sample(8), nrow=2))
lst
# [[1]]
# [,1] [,2] [,3] [,4]
# [1,] 8 2 3 4
# [2,] 7 5 6 1
# [[2]]
# [,1] [,2] [,3] [,4]
# [1,] 6 3 7 8
# [2,] 5 4 1 2
# [[3]]
# [,1] [,2] [,3] [,4]
# [1,] 8 3 4 2
# [2,] 1 6 7 5
使用abind库,我们可以沿第三个dim任意绑定。 (这是您要开始的地方,因为您的 data.frames 已经被捕获在一个列表中。abind 与同样大小的 data.frames 和矩阵同样适用。)
library(abind)
ary <- abind(lst, along = 3)
dim(ary)
# [1] 2 4 3
现在沿着每个“管”运行任意函数(相对于“行”或“列”,大多数人认为apply 用于)。例如,假设三层中的[1,1] 值为 8、6 和 8,我们会期望以下统计信息:
mean(c(8,6,8))
# [1] 7.333333
sd(c(8,6,8))
# [1] 1.154701
现在,使用apply:
apply(ary, 1:2, mean)
# [,1] [,2] [,3] [,4]
# [1,] 7.333333 2.666667 4.666667 4.666667
# [2,] 4.333333 5.000000 4.666667 2.666667
apply(ary, 1:2, sd)
# [,1] [,2] [,3] [,4]
# [1,] 1.154701 0.5773503 2.081666 3.055050
# [2,] 3.055050 1.0000000 3.214550 2.081666
这会打开 1000 个大小相同的 data.frames 的更多统计聚合,假设每个层内的索引具有有意义的可比性。您或许可以设计一个工作模型来使用Reduce 确定中位数或其他百分位数,但很容易做到(例如)apply(ary, 1:2, quantile, 0.9) 第 90 个百分位数。