如何用R实现两个或多个直方图的均值计算
R语言两个直方图求平均的实现方法
报错原因
你遇到的报错不是两个向量长度不同导致的,核心问题是调用hist()函数时没有统一指定断点:默认情况下hist()会基于输入数据自身的最小值、最大值生成分区间断点,即使你都设置了breaks=100,只要两列数据的取值范围有差异,生成的h1和h2的断点(breaks)数值就会不一致,而AddHistograms()要求所有输入直方图的断点必须完全一致才能运算。
方法1:使用HistogramTools包实现
提前统一两个直方图的断点即可正常调用函数,示例代码如下:
# 提取两列的有效值 val1 <- na.omit(a[,1]) val2 <- na.omit(a[,2]) # 合并计算全局取值范围,生成统一断点(100个区间对应101个断点) common_breaks <- seq(min(c(val1, val2)), max(c(val1, val2)), length.out = 101) # 用统一断点分别生成直方图 h1 <- hist(val1, breaks = common_breaks, plot = F) h2 <- hist(val2, breaks = common_breaks, plot = F) # 调用函数求和后计数除以2得到平均直方图 library(HistogramTools) sum_hist <- AddHistograms(h1, h2) avg_hist <- sum_hist avg_hist$counts <- avg_hist$counts / 2 # 如需绘制直接调用plot即可 # plot(avg_hist)
方法2:无需额外包手动实现
如果不想依赖第三方包,可以手动统计区间计数后计算平均值,示例代码如下:
# 提取有效值+生成统一断点逻辑和上面一致 val1 <- na.omit(a[,1]) val2 <- na.omit(a[,2]) common_breaks <- seq(min(c(val1, val2)), max(c(val1, val2)), length.out = 101) # 分别统计两个数据在统一区间下的计数 count1 <- hist(val1, breaks = common_breaks, plot = F)$counts count2 <- hist(val2, breaks = common_breaks, plot = F)$counts # 计算平均计数,手动构造直方图对象 avg_counts <- (count1 + count2) / 2 avg_hist <- list( breaks = common_breaks, counts = avg_counts, mids = (common_breaks[-1] + common_breaks[-length(common_breaks)])/2, xname = "average of two columns", equidist = TRUE ) class(avg_hist) <- "histogram" # 绘制平均直方图 # plot(avg_hist)
补充说明
如果你需要的是频率平均而非计数平均,可以将上述代码中的counts替换为density,或是先将两个直方图的计数分别除以各自的总样本数后再做平均即可。
内容的提问来源于stack exchange,提问作者learners
相关产品推荐
相关产品推荐

