如何按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
相关产品推荐
相关产品推荐

