如何用R的dplyr包生成排除自身的Duplicate_IDs列?
正确生成排除自身的重复ID列的dplyr实现
原代码的问题是直接拼接了分组内的所有ID,没有排除当前行的ID,导致每行得到的是组内全部ID,而非除自身外的重复ID。以下是两种正确实现方式:
方式一:结合purrr包处理
library(dplyr) library(purrr) data <- data %>% group_by(`Column A`, `Column B`, `Column C`) %>% mutate(Duplicate_IDs = ifelse( n() > 1, map_chr(id, ~paste(setdiff(id, .x), collapse = ",")), NA_character_ )) %>% ungroup()
逻辑说明:
- 按
Column A、Column B、Column C分组,识别重复组 - 仅当组内行数大于1时生成重复ID列表,否则赋值为NA
- 用
map_chr逐行处理:对当前行的ID,通过setdiff从组内所有ID中移除自身,再拼接成字符串
方式二:仅用base R + dplyr实现
如果不想引入purrr包,可使用sapply替代:
library(dplyr) data <- data %>% group_by(`Column A`, `Column B`, `Column C`) %>% mutate(Duplicate_IDs = ifelse( n() > 1, sapply(id, function(x) paste(id[id != x], collapse = ",")), NA_character_ )) %>% ungroup()
逻辑说明:
- 核心逻辑与方式一一致,通过
sapply遍历每个ID,筛选出组内不等于当前ID的元素后拼接
运行任意一种代码,都能得到预期的Duplicate_IDs列:
- id=8的行将得到
10 - id=17的行将得到
18,19 - id=20的行保持NA
内容的提问来源于stack exchange,提问作者Shashank Kalluri
相关产品推荐
相关产品推荐

