在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的统计结果合并成一个长格式数据框,同时记录每个结果来自哪个dfpivot_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
相关产品推荐
相关产品推荐

