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
相关产品推荐
相关产品推荐

