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

在R中无需合并数据框计算数据框列表的分组均值

无需合并数据框计算分组均值的高效方法

我们手里有一组结构一致的数据框:每个数据框都包含列A(所有数据框的A列完全相同)和列B(仅B列数值有差异),需要计算每个A值对应的所有数据框中B值的平均值。常规的合并数据框再聚合的方法,在数据量较大时会因为内存占用和计算成本导致运行缓慢,这里提供几种无需合并整个数据框的高效解决方案:

可复现代码示例

set.seed(123) # 设置随机种子保证结果可复现
A = 1:20
X = rnorm(20)
Y = rnorm(20)
Z = rnorm(20)

# 所有数据框的A列完全相同,仅B列不同
df1 <- data.frame(A=A, B=X)
df2 <- data.frame(A=A, B=Y)
df3 <- data.frame(A=A, B=Z)

list_of_dfs <- list(df1, df2, df3)

# 常规合并后计算的方法(大数据量下效率低)
joined <- bind_rows(list_of_dfs)
original_result <- aggregate(joined$B, list(joined$A), mean)

解决方案1:矩阵行均值法(Base R 高效版)

利用所有数据框A列一致的特性,直接提取所有B列组成矩阵,再按行计算均值:

# 提取所有数据框的B列,生成矩阵
b_matrix <- sapply(list_of_dfs, function(df) df$B)
# 计算每行的均值(对应每个A值的所有B的平均)
mean_b <- rowMeans(b_matrix)
# 组合成结果数据框
result1 <- data.frame(A = list_of_dfs[[1]]$A, mean_B = mean_b)

这种方法完全跳过了数据框合并操作,rowMeans是R中高度优化的函数,计算效率极高,内存占用也远低于合并整个数据框。

解决方案2:Tidyverse风格的列合并均值法

如果习惯使用tidyverse工具包,可以用purrr提取所有B列后计算行均值:

library(purrr)

# 提取所有B列并按列合并为数据框
b_df <- map_dfc(list_of_dfs, ~ .x$B)
# 计算每行均值
mean_b <- rowMeans(b_df)
# 组合结果
result2 <- data.frame(A = list_of_dfs[[1]]$A, mean_B = mean_b)

这里仅合并了需要计算的B列,而非整个数据框,效率比bind_rows全量合并高很多。

解决方案3:累加求和再求均值(低内存版)

如果数据量极大,矩阵存储也会占用过多内存,可以用Reduce逐个累加B列,最后除以数据框总数得到均值:

# 初始化累加向量,逐个累加每个数据框的B列
total_b <- Reduce(function(acc, df) acc + df$B, list_of_dfs, init = numeric(length(list_of_dfs[[1]]$A)))
# 计算均值
mean_b <- total_b / length(list_of_dfs)
# 组合结果
result3 <- data.frame(A = list_of_dfs[[1]]$A, mean_B = mean_b)

这种方法全程仅维护一个累加向量,内存占用最小,适合超大规模数据场景。

结果验证

三种方法的结果和常规方法完全一致:

all.equal(result1$mean_B, original_result$x)
all.equal(result2$mean_B, original_result$x)
all.equal(result3$mean_B, original_result$x)

内容的提问来源于stack exchange,提问作者lafinur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:01:43