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

按ID对比DataFrame行,计算匹配得分并提取不匹配项

按ID分组对比组内行并计算匹配得分及提取不匹配项

原始DataFrame

IDcol1Col2
AB13
AB13
CD24
CD23
EF510
EF11
GH510
GH110

需求说明

按ID分组处理:

  • 若某列组内所有值完全相等,Total列加1分;存在不同值则该列不得分
  • 生成不匹配提取列,记录对应列的组内不同值(格式为值1:值2),无差异则填充Na

期望输出

IDcol1Col2Totalmismatch_extract_col1mismatch_extract_Col2
AB132NaNa
AB132NaNa
CD241Na4:3
CD231Na4:3
EF5100NaNa
EF110NaNa
GH51015:1Na
GH11015:1Na

尝试的代码(未达成需求)

df <- df %>% 
  group_by(ID) %>% 
  mutate(change = ifelse(col1 == lag(col1), 1, 0))

解决方案代码

library(dplyr)

df <- df %>%
  group_by(ID) %>%
  # 判断每列组内是否全匹配,提取不匹配值
  mutate(
    col1_match = n_distinct(col1) == 1,
    col2_match = n_distinct(Col2) == 1,
    # 计算总得分:匹配列的数量
    Total = as.integer(col1_match) + as.integer(col2_match),
    # 生成不匹配提取文本,匹配则填Na
    mismatch_extract_col1 = ifelse(col1_match, "Na", paste(unique(col1), collapse = ":")),
    mismatch_extract_Col2 = ifelse(col2_match, "Na", paste(unique(Col2), collapse = ":"))
  ) %>%
  # 移除辅助计算列
  select(-col1_match, -col2_match) %>%
  ungroup()

代码说明

  • n_distinct():统计组内列的唯一值数量,等于1则说明该列所有值一致
  • Total:将匹配标记转换为整数后求和,得到总匹配得分
  • paste(unique(colX), collapse = ":"):把列内的不同值用冒号拼接,生成不匹配提取内容
  • 最后清理辅助列并取消分组,得到目标结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:41:44