在R中利用%in%逻辑表达式处理互逆重复行:保留唯一行
解决双向重复行的保留问题
我来帮你搞定这个双向重复行的处理需求!你要的是把(A,B)和(B,A)这种互为镜像的行视为重复组,每组只保留一行,下面给你两种实用的实现方法:
先构造示例数据(方便你复现)
首先我们先把你的示例数据转换成可运行的R对象:
df <- data.frame( Index = 1:3, IndexA = c("A", "B", "A"), IndexB = c("B", "A", "C") )
方法一:Base R 原生实现
核心思路是给每一行生成一个统一的配对标识——不管IndexA和IndexB的顺序如何,排序后拼接成的字符串都是一样的,然后根据这个标识去重:
# 生成排序后的配对键,比如(A,B)和(B,A)都会生成"A-B" df$pair_key <- apply(df[, c("IndexA", "IndexB")], 1, function(x) paste(sort(x), collapse = "-")) # 保留每个配对键对应的第一行,去掉重复项 result <- df[!duplicated(df$pair_key), ] # 移除临时生成的配对键列 result <- result[, !names(result) %in% "pair_key"] # 查看结果 print(result)
运行后会得到你想要的输出:
Index IndexA IndexB 1 1 A B 3 3 A C
方法二:dplyr 简洁实现(适合tidyverse用户)
如果你平时用tidyverse工具链,这个写法更直观易读:
library(dplyr) result <- df %>% # 按行处理,对每行的IndexA和IndexB排序后生成配对键 rowwise() %>% mutate(pair_key = paste(sort(c(IndexA, IndexB)), collapse = "-")) %>% ungroup() %>% # 按配对键去重,保留所有列 distinct(pair_key, .keep_all = TRUE) %>% # 删除临时的配对键列 select(-pair_key) print(result)
补充说明
你之前写的duplicates<-df[df$IndexA %in% df$IndexB & df$IndexB %in% df$IndexA,]只是筛选出了所有存在双向配对的行,但还需要进一步分组去重。上面的方法直接从原数据出发,一步完成“生成统一标识+去重”的操作,效率更高也更简洁。
内容的提问来源于stack exchange,提问作者user183974
相关产品推荐
相关产品推荐

