R语言如何对多个同维度数组计算标准差、均值及百分位数
问题原因
R基础包的sd()仅支持对单个数据对象计算整体标准差,无法识别多数组同位置运算的需求,因此你原有写法无法得到预期结果。
实现方案
步骤1:合并多个同维度数组为高维数组
首先把所有输入数组沿新增的最后一个维度合并,该维度的长度等于输入数组的个数:
# 构造示例数组(和你的测试代码一致) m1 <- array(runif(8), dim = c(2, 2, 2)) m2 <- array(runif(8), dim = c(2, 2, 2)) m3 <- array(runif(8), dim = c(2, 2, 2)) # 基础包实现合并,最终维度为c(2,2,2,3),最后一维对应3个输入数组 arr_combined <- array(c(m1, m2, m3), dim = c(dim(m1), 3))
如果习惯用第三方包,也可以用abind包的abind()函数实现合并:
arr_combined <- abind::abind(m1, m2, m3, along = 4)
步骤2:按位置计算所需指标
使用apply()函数沿输入数组的原有维度聚合,即可得到和输入维度一致的结果:
# 计算同位置均值,结果维度和输入数组一致 mean_arr <- apply(arr_combined, MARGIN = 1:length(dim(m1)), FUN = mean) # 计算同位置标准差 sd_arr <- apply(arr_combined, MARGIN = 1:length(dim(m1)), FUN = sd) # 计算同位置指定百分位数,示例为25%、50%、75%分位 percentile_res <- apply(arr_combined, MARGIN = 1:length(dim(m1)), FUN = quantile, probs = c(0.25, 0.5, 0.75)) # 提取单个百分位数的结果,示例提取50%分位(中位数),维度和输入数组一致 median_arr <- percentile_res["50%", , , ]
你可以通过dim(mean_arr)验证,返回结果为2 2 2,和输入的m1维度完全匹配。
大数据量优化方案
如果输入数组维度很大,apply()的运行效率偏低,可以用matrixStats包的向量化函数提速:
library(matrixStats) # 把高维数组转换为矩阵,每一列对应一个位置的所有数组取值 calc_mat <- t(matrix(arr_combined, ncol = dim(arr_combined)[4])) # 计算均值 mean_arr_fast <- array(colMeans2(calc_mat), dim = dim(m1)) # 计算标准差 sd_arr_fast <- array(colSds(calc_mat), dim = dim(m1)) # 计算百分位数 percentile_mat <- colQuantiles(calc_mat, probs = c(0.25,0.5,0.75)) median_arr_fast <- array(percentile_mat[,"50%"], dim = dim(m1))
内容的提问来源于stack exchange,提问作者Dee1999
相关产品推荐
相关产品推荐

