基于共享前缀对R列表中多组DataFrame求算术平均
解决R语言中DataFrame列表按前缀分组计算算术平均的问题
问题概述
我有一个DataFrame列表,列表里的每个DataFrame属于一组配对,通过名称的共享前缀(比如001)就能识别分组关系,组内的DataFrame名称后缀不同(比如_AB、_CD)。除了标识符变量idvar外,所有DataFrame的其他列(col1、col2、col3)都是数值类型。需要对每一组的DataFrame计算算术平均,结果不需要保留后缀信息,最终输出还是DataFrame列表而不是单个大DataFrame,而且因为有30+个唯一前缀,不想逐个手动指定。
解决方案
方法1:tidyverse风格(dplyr + purrr)
代码简洁可读性高,适合熟悉tidyverse生态的用户:
library(dplyr) library(purrr) library(stringr) # 1. 自动提取前缀并分组 prefixes <- names(the_problem) %>% str_extract("^[^_]+") grouped_dfs <- the_problem %>% split(prefixes) # 2. 对每组计算算术平均 averaged_dfs <- grouped_dfs %>% map(function(dfs) { # 组内所有DataFrame对应元素相加后除以数量,得到逐元素平均 reduce(dfs, `+`) / length(dfs) }) # 3. 添加idvar列并整理成目标格式 final_solution <- averaged_dfs %>% imap(function(df, prefix) { df %>% mutate(idvar = prefix) %>% relocate(idvar) # 可选:将idvar移至第一列,和示例结构一致 })
方法2:Base R实现
无需加载额外包,用原生语法完成:
# 1. 提取前缀并分组 prefixes <- sub("_.*", "", names(the_problem)) grouped_dfs <- split(the_problem, prefixes) # 2. 计算平均并添加idvar final_solution_base <- lapply(grouped_dfs, function(df_group) { # 组内所有DataFrame对应元素相加后取平均 avg_df <- Reduce("+", df_group) / length(df_group) # 添加idvar列并保持格式 cbind(idvar = sub("_.*", "", names(df_group)[1]), avg_df) })
代码说明
- 自动分组:通过正则表达式提取每个DataFrame名称的前缀(下划线之前的部分),无需手动指定30+个前缀,自动完成分组。
- 平均计算:利用
reduce/Reduce将组内所有DataFrame的对应数值元素相加,再除以组内DataFrame的数量,得到逐元素的算术平均,兼容组内2个或多个DataFrame的情况。 - 格式对齐:将分组前缀作为
idvar的值添加到结果中,同时将列表命名为对应前缀,完全匹配目标结构。
内容的提问来源于stack exchange,提问作者jrcalabrese
相关产品推荐
相关产品推荐

