R语言实现数据框ID2至ID1000列逐行重复条目检测方法
实现方案
我们可以通过逐行提取ID列的非空值,判断去重前后的长度差异来识别重复行,代码支持自动匹配ID2到ID1000的所有ID列,不需要手动指定列名,适配大范围ID列的场景。
完整实现代码(tidyverse版本,可读性高)
library(tidyverse) # 1. 自动识别所有带数字后缀的ID列(自动覆盖ID2到ID1000) id_cols <- str_subset(colnames(df), "^ID\\d+$") # 2. 逐行校验重复并打标 df_result <- df %>% rowwise() %>% mutate( # 提取当前行所有ID列的非NA值 id_values = list(na.omit(c_across(all_of(id_cols)))), # 标记是否存在重复:去重后长度小于原长度说明有重复 是否存在重复ID = length(id_values) != length(unique(id_values)), # 列出具体重复的ID值,方便后续排查 重复的ID值 = ifelse(是否存在重复ID, paste(names(which(table(id_values) >=2)), collapse = ","), NA_character_) ) %>% # 移除中间辅助列,不需要该列可保留本行 select(-id_values) %>% ungroup()
结果说明
执行代码后会在原数据框新增两列标记:
是否存在重复ID:逻辑值,TRUE代表该行有重复ID,FALSE代表无重复重复的ID值:如果存在重复,会把重复的具体ID值拼接列出,没有重复则为NA
用你提供的示例数据测试,输出结果会正确匹配需求:
- 第二行
是否存在重复ID为TRUE,重复的ID值为A0012 - 第八行
是否存在重复ID为TRUE,重复的ID值为AB982
轻量Base R版本(无需加载第三方包)
如果不想安装tidyverse,可以用原生R代码实现相同功能:
# 识别所有带数字后缀的ID列 id_cols <- grep("^ID\\d+$", colnames(df), value = T) # 打标是否存在重复 df$是否存在重复ID <- apply(df[, id_cols], 1, function(x) { x_no_na <- na.omit(x) length(x_no_na) != length(unique(x_no_na)) }) # 提取具体重复值(可选) df$重复的ID值 <- apply(df[, id_cols], 1, function(x) { x_no_na <- na.omit(x) tab <- table(x_no_na) ifelse(any(tab >=2), paste(names(tab[tab >=2]), collapse = ","), NA_character_) })
内容的提问来源于stack exchange,提问作者coder2learn
相关产品推荐
相关产品推荐

