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

如何按DataFrame内置分组标题拆分出多个子DataFrame

按分组标题拆分DataFrame为多个独立数据集

给定一个包含分组标题的DataFrame,标题行的三个列(person1、person2、score)值完全相同,需要将每个标题下到下一个标题前的数据提取出来,生成对应名称的独立DataFrame。

实现步骤

  • 标记所有分组标题行
  • 为每行分配对应的分组标签
  • 按分组标签拆分DataFrame,并移除每个子DataFrame中的标题行

具体R代码

# 复现用户提供的原DataFrame
df <- structure(list(person1 = c("MD (mon)", "john", "steven", "david", 
                                 "MD (2)", "john", "steven", "david", "MQ (W)", "john", "steven", 
                                 "david"), 
                     person2 = c("MD (mon)", "david", "james", "harry", 
                                 "MD (2)", "david", "james", "harry", "MQ (W)", "david", "james", 
                                 "harry"), 
                     score = c("MD (mon)", "1-2", "1-1", "2-0", "MD (2)", 
                               "0-0", "5-1", "0-1", "MQ (W)", "2-2", "3-1", "2-2")), 
                class = "data.frame", row.names = c(NA, -12L))

# 1. 标记标题行:判断三列值是否完全一致
df$is_header <- df$person1 == df$person2 & df$person1 == df$score

# 2. 生成分组标签:用标题文本标记对应的数据行
df$group <- ifelse(df$is_header, df$person1, NA)
# 前向填充,给标题下的所有数据行分配对应分组名
df$group <- zoo::na.locf(df$group)

# 3. 拆分DataFrame并清理辅助列
split_dfs <- lapply(split(df, df$group), function(sub_df) {
  # 移除标题行和辅助列
  sub_df <- sub_df[!sub_df$is_header, ]
  sub_df[, !(colnames(sub_df) %in% c("is_header", "group"))]
})

# 将拆分后的数据集存入全局环境,命名格式为「标题名+Df」
for (name in names(split_dfs)) {
  df_name <- paste0(gsub("\\s", "", name), "Df")
  assign(df_name, split_dfs[[name]], envir = .GlobalEnv)
}

验证结果

运行代码后,全局环境会生成三个独立DataFrame:MD(mon)Df、MD(2)Df、MQ(W)Df。以MD(mon)Df为例,内容如下:

> MD(mon)Df
  person1 person2 score
2    john   david   1-2
3  steven   james   1-1
4   david   harry   2-0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 17:28:27