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

R语言实现动态Group By:批量计算特征A的分组均值

批量按分类特征分组计算均值的解决方案

首先,我明白你的需求:你手头有包含数值特征A和分类特征B、C的数据框,想要避免重复编写分组求和代码,批量遍历B、C这两个分类特征,分别计算A在各分组下的均值,最后把结果整理成方便查看的格式。

先看你给出的原始数据:

df = data.frame( 
  A = c(1, 4, 5, 13, 2), 
  B = c("Group 1", "Group 3", "Group 2", "Group 1", "Group 2"), 
  C = c("Group 3", "Group 2", "Group 1", "Group 2", "Group 3") 
)

你之前尝试的map_df代码逻辑有偏差,下面给你两种可行的解决方案:

方法一:用purrr::map生成结果列表

如果你想把每个分组的结果单独存在列表里,方便逐个查看,可以这么写:

library(dplyr)
library(purrr)

# 指定要用来分组的列名(B和C)
group_cols <- c("B", "C")

# 遍历每个分组列,计算A的均值
result_list <- map(group_cols, function(col) {
  df %>% 
    group_by(!!sym(col)) %>% 
    summarise(mean_A = mean(A), .groups = "drop")
})

# 给列表命名,方便识别分组来源
names(result_list) <- group_cols

# 查看结果
result_list

运行后,result_list里会有两个命名元素,比如result_list$B就是按B分组的均值结果,result_list$C对应按C分组的结果,清晰直观。

方法二:用purrr::map_dfr合并成单个数据框

如果你希望把所有结果合并成一个数据框,同时标注分组来源,方便批量对比,可以用map_dfr并添加分组标记列:

result_df <- map_dfr(group_cols, function(col) {
  df %>% 
    group_by(!!sym(col)) %>% 
    summarise(
      group_source = col,  # 添加一列标注当前是按哪个变量分组的
      mean_A = mean(A), 
      .groups = "drop"
    )
})

# 查看合并后的结果
result_df

这样得到的result_df会包含三列:分组类别(比如Group 1)、分组来源(B或C)、对应的A的均值,非常适合批量查看对比不同分组变量下的均值分布。

为什么你的原代码有问题?

你之前的代码逻辑走偏了:

  • map_df(df, ...)是遍历数据框的每一列,而不是你想要的指定分组列
  • names(df)[1:i]会从第一列开始累计分组列,比如第一次是A,第二次是A+B,第三次是A+B+C,这完全不是你要的「按单个分类列分组」的逻辑

上面的两种方法都能完美解决你的需求,既避免了重复写代码,又能高效批量得到结果~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:43:13