You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:01:00