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

基于共享前缀对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:52:48