R dataframe字符行对比:NA匹配任意值并生成分组ID方案
解决思路
- 先定义匹配规则:两行归为同一组的条件是,所有对应位置的元素要么取值相等,要么至少其中一个为NA
- 按行遍历原始数据,维护已生成分组的模板列表(模板取每个组第一个出现的行的取值)
- 对当前行,依次匹配已有分组的模板,匹配成功则复用该组ID,匹配失败则生成新的连续ID并将当前行存入模板列表
实现代码
library(tidyverse) # 定义两行匹配判断函数 is_row_match <- function(row_a, row_b) { all((row_a == row_b) | is.na(row_a) | is.na(row_b), na.rm = TRUE) } # 遍历生成分组ID group_templates <- list() group_ids <- c() current_max_id <- 0 for (i in seq(nrow(sets))) { current_row <- sets[i, ] matched_group <- NA # 匹配已有分组 for (g in seq_along(group_templates)) { if (is_row_match(current_row, group_templates[[g]])) { matched_group <- g break } } # 处理匹配结果 if (is.na(matched_group)) { current_max_id <- current_max_id + 1 matched_group <- current_max_id group_templates[[matched_group]] <- current_row } group_ids <- c(group_ids, paste0("Group", matched_group)) } # 合并分组ID到原数据 result_df <- sets %>% as.data.frame() %>% mutate(COMP = group_ids)
运行结果
Var1 Var2 Var3 Var4 COMP Set1 A B C A Group1 Set2 A D B A Group2 Set3 <NA> B C A Group1 Set4 A D B A Group2 Set5 F G <NA> F Group3 Set6 A B C C Group4
注:你给出的预期示例中Set4归为Group3属于笔误,Set4和Set2所有字段完全一致,按照规则会归为同一Group2,若你有特殊的分组顺序要求可以调整匹配逻辑。
性能优化提示
- 当数据量较大(万行以上)时,可以将每行的非NA字段和对应列名组合生成唯一特征键,用命名向量替代列表存储分组映射,匹配效率会有显著提升。
内容的提问来源于stack exchange,提问作者lávà
相关产品推荐
相关产品推荐

