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

在R语言中合并多个数据框summary的stage列至新数据框

解决方案:批量提取stage列统计并重塑数据框

嘿,这个需求我经常碰到,批量处理一堆结构一致的数据框然后汇总成你想要的格式,完全没问题!下面给你两种实现方式,你可以根据自己的习惯选:


方法一:用tidyverse工具链(代码更直观易读)

如果你已经装了dplyr和tidyr包,这个方法会很顺手:

# 1. 自动收集所有以df开头+数字的数据框(比如df1、df2...)
dfs_list <- mget(ls(pattern = "^df\\d+$"))

# 2. 写一个小函数,从单个数据框里提取stage列的计数
extract_stage_counts <- function(df) {
  # 获取stage列的汇总统计(这里假设stage是因子类型,summary会返回各水平计数)
  stage_stats <- summary(df$stage)
  # 只保留我们需要的stage1、stage2、stage3(如果有其他水平会自动过滤)
  stage_stats <- stage_stats[grepl("^stage\\d+$", names(stage_stats))]
  # 转成数据框格式,方便后续合并
  data.frame(stage = names(stage_stats), count = as.numeric(stage_stats), row.names = NULL)
}

# 3. 给所有数据框应用这个函数,得到每个df的stage统计列表
all_stage_data <- lapply(dfs_list, extract_stage_counts)

# 4. 合并+重塑成目标格式
library(dplyr)
library(tidyr)

final_summary_df <- bind_rows(all_stage_data, .id = "df_name") %>%
  pivot_wider(
    names_from = df_name,  # 把df名称转成列
    values_from = count,   # 填充对应的计数值
    values_fill = list(count = 0)  # 如果某个df缺少某stage,自动填0
  ) %>%
  arrange(stage)  # 按stage1、stage2、stage3排序

代码解释:

  • mget(ls(pattern = "^df\\d+$")):自动抓取所有符合df+数字命名规则的数据框,不用手动一个个列出来(40个手动列太疯了😂)
  • extract_stage_counts函数:专门处理单个df,提取stage列的计数并整理成统一格式
  • bind_rows(..., .id = "df_name"):把所有df的统计结果合并成一个长格式数据框,同时记录每个结果来自哪个df
  • pivot_wider:把长格式转成宽格式——也就是你要的「行是stage,列是df名称」的结构

方法二:用基础R实现(无需额外安装包)

如果不想装tidyverse包,用基础R也能搞定:

# 1. 同样先收集所有目标数据框
dfs_list <- mget(ls(pattern = "^df\\d+$"))

# 2. 提取每个df的stage计数,转成命名向量
stage_vectors <- lapply(dfs_list, function(df) {
  stage_stats <- summary(df$stage)
  # 过滤出stage1-3的计数,转成数值向量
  stats_filtered <- stage_stats[grepl("^stage\\d+$", names(stage_stats))]
  as.numeric(stats_filtered)
})

# 3. 把所有向量合并成矩阵,再转置得到目标结构
final_matrix <- do.call(cbind, stage_vectors)
# 设置行名(stage1/2/3)和列名(df1/df2/...)
rownames(final_matrix) <- names(stage_vectors[[1]])
colnames(final_matrix) <- names(dfs_list)

# 4. 转成数据框(如果需要的话)
final_summary_df <- as.data.frame(final_matrix)

注意点:

  • 如果你的某个df里缺少某个stage水平(比如某个df没有stage3),基础R版本会自动补NA,你可以用final_matrix[is.na(final_matrix)] <- 0把NA替换成0
  • 确保所有df的stage列水平一致(都是stage1、stage2、stage3),这样合并的时候才不会出错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:44:16