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

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à

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:54:02