基于两列组合去除R语言data.frame中的重复行
去除双向重复的data.frame行(A-B与B-A视为重复)
给定如下R语言数据框:
df1 <- data.frame(v1 = c('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'), v2 = c('B', 'A', 'D', 'C', 'F', 'E', 'H', 'G'), value = c(1.12, 1.12, 12.52, 12.52, 3.19, 3.19, 12.52, 12.52))
其中v1和v2的双向组合(如A-B与B-A)且value值相同的行属于重复项,需要保留每组中的一行,得到目标结果。
方法一:基础R实现
核心思路是给每组双向重复行生成统一的标识,再结合value去重:
# 为每行生成排序后的组合标识(A-B和B-A都会变成"A-B") df1$pair <- apply(df1[, c("v1", "v2")], 1, function(x) paste(sort(x), collapse = "-")) # 根据组合标识和value去重,保留首次出现的行 df2 <- df1[!duplicated(df1[, c("pair", "value")]), ] # 删除临时生成的pair列 df2 <- df2[, c("v1", "v2", "value")] # 查看结果 df2
方法二:dplyr(tidyverse)实现
用tidyverse风格的代码更简洁直观:
library(dplyr) df2 <- df1 %>% rowwise() %>% # 逐行生成排序后的组合标识 mutate(pair = paste(sort(c(v1, v2)), collapse = "-")) %>% ungroup() %>% # 按组合标识和value去重,保留所有列 distinct(pair, value, .keep_all = TRUE) %>% # 移除临时列 select(-pair) # 查看结果 df2
方法三:直接筛选(适用于数据规律明确的情况)
如果你的数据中每组双向重复行里,总有一行v1的字母顺序在v2之前,直接筛选即可:
df2 <- df1[df1$v1 < df1$v2, ]
这个方法最简单,直接得到目标结果。
内容的提问来源于stack exchange,提问作者Sylvia Rodriguez
相关产品推荐
相关产品推荐

