拆分含重复列名标识的DataFrame:生成带ID的子数据框
拆分包含分隔行的DataFrame为多个子DataFrame
问题描述
我有一个大型数据集,整合了多个具有共同列名的数据框,其中包含以列名作为内容的分隔行。示例数据构造如下:
library(tibble) df <- tibble( A = c(runif(3), "A", runif(4), "A", runif(5)), B = c(runif(3), "B", runif(4), "B", runif(5)), C = c(runif(3), "C", runif(4), "C", runif(5)), D = c(runif(3), "D", runif(4), "D", runif(5)) )
需要将分隔行之间的数值行拆分为独立的子DataFrame,并为每个子DataFrame添加id列标识分组,最终得到df1、df2、df3这样的结果。
解决方案
可以通过标记分隔行、生成分组ID、过滤拆分三个步骤实现:
1. 完整代码实现
library(tibble) library(dplyr) # 设置随机种子保证结果可复现 set.seed(123) # 构造示例数据 df <- tibble( A = c(runif(3), "A", runif(4), "A", runif(5)), B = c(runif(3), "B", runif(4), "B", runif(5)), C = c(runif(3), "C", runif(4), "C", runif(5)), D = c(runif(3), "D", runif(4), "D", runif(5)) ) # 步骤1:标记所有分隔行(每行所有元素等于对应列名的行) sep_rows <- apply(df, 1, function(row) all(row == colnames(df))) # 步骤2:生成分组ID,确保分隔行前后的数值行属于不同分组 group_ids <- cumsum(c(TRUE, sep_rows[-length(sep_rows)])) # 步骤3:过滤分隔行、添加id列并拆分为子DataFrame result_list <- df[!sep_rows, ] %>% mutate(id = group_ids[!sep_rows]) %>% group_split(id, .keep = FALSE) %>% setNames(paste0("df", seq_along(.))) # 查看结果示例 print(result_list$df1) print(result_list$df2) print(result_list$df3)
2. 代码解释
- 标记分隔行:使用
apply逐行检查,判断该行每个元素是否与对应列名完全匹配,得到一个逻辑向量sep_rows,标记出所有分隔行。 - 生成分组ID:通过
cumsum累积分隔行的标记,调整后确保第一个数值块属于分组1,每遇到一个分隔行,后续数值块的分组ID自动加1。 - 过滤与拆分:先过滤掉所有分隔行,为剩余行添加
id列,再用group_split按id拆分,最后为每个子DataFrame命名为df1、df2等。
内容的提问来源于stack exchange,提问作者mand3rd
相关产品推荐
相关产品推荐

