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

拆分含重复列名标识的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:47:27