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

基于两列组合去除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:01:23