R语言如何计算多个同结构table对象的逐元素平均值
R中多个同结构
table对象逐元素求均值实现 本讨论严格围绕基础R的
table类型对象展开,不涉及名称含"table"的data.frame相关操作。
核心需求为对多个结构完全一致的table列联表对象,计算对应位置元素的平均值。
常见错误与现有可行方案
先构造测试用table对象:
test1 <- head(table(iris$Sepal.Length, iris$Species))
对象数量较少时,直接逐对象相加再除以个数可以得到正确结果:
(test1 + test1 + test1) / 3
运行输出如下,保留了原表的维度和行列名:
setosa versicolor virginica 4.3 1 0 0 4.4 3 0 0 4.5 1 0 0 4.6 4 0 0 4.7 2 0 0 4.8 5 0 0
直接用c()拼接table对象后调用统计函数会丢失维度属性,将列联表强转为一维向量,得到错误的单值结果:
mean(c(test1,test1,test1)) # [1] 0.8888889 sum(c(test1,test1,test1)) / 3 # [1] 16
目前已知的通用可行方案是将多个table存入列表,借助Reduce逐元素求和后除以对象数量:
Reduce(`+`, list(test1, test1, test1)) / 3
更简便的实现方式
table本质是带维度名称属性的整数数组,不需要手动迭代求和,只要将多个同结构table拼接为多维数组后,按原表维度求均值即可,完全可以避免手动构造list做反复转换:
- 基础R无依赖写法:直接通过
simplify2array将多个table拼接为三维数组(第三维对应不同的table对象),调用rowMeans指定保留前两个维度求均值,效率比Reduce更高,还能自动保留原表的行列名。如果是批量生成的table对象,可以用mget直接匹配环境中的对象,不需要手动逐个录入列表:
# 示例:批量匹配环境中命名符合test前缀的table对象,拼成三维数组 tbl_array <- simplify2array(mget(ls(pattern = "^test\\d+"))) # 对前两维(原table的行、列)求均值 result <- rowMeans(tbl_array, dims = 2)
- 第三方包简洁写法:如果可以使用扩展包,
abind支持直接传入多个table对象沿指定维度拼接,不需要手动构造列表,再用apply按维度求均值即可:
# 首次使用需安装 # install.packages("abind") library(abind) result <- apply(abind(test1, test1, test1, along = 3), c(1,2), mean)
两种写法返回的结果和手动相加、Reduce求和的结果完全一致,一维table只需要调整维度参数为1即可适配。
内容的提问来源于stack exchange,提问作者aiorr
相关产品推荐
相关产品推荐

