如何通过查看数据框中的其他列值来删除重复值?

How can I remove duplicate values by looking at other column values in the data frame?

有两列item1和item2列的值相反,列的顺序是随机的。

我想查找并删除 item1 和 item2 列中具有相同值的数据。

像这样...

我该怎么办?

我正在考虑一个更普遍的案例

dput(df)

df <- structure(list(Item1 = c("A", "C", "B", "D", "E", "F"), Item2 = c("B", 
"D", "A", "C", "F", "E"), Result = c(0.5, 0.1, 0.5, 0.1, 0.7, 
0.6)), class = "data.frame", row.names = c(NA, -6L))

> df
  Item1 Item2 Result
1     A     B    0.5
2     C     D    0.1
3     B     A    0.5
4     D     C    0.1
5     E     F    0.7
6     F     E    0.6

代码

library(tidyverse)

df %>% pivot_longer(cols = c("Item1", "Item2")) %>%
  group_by(Result, value) %>%
  slice_head() %>%
  group_by(Result) %>%
  pivot_wider(id_cols = Result, names_from = name, values_from = value)

# A tibble: 4 x 3
# Groups:   Result [4]
  Result Item1 Item2
   <dbl> <chr> <chr>
1    0.1 C     D    
2    0.5 A     B    
3    0.6 F     E    
4    0.7 E     F

您可以使用 pminpmax 按字母顺序对值进行排序,select 对唯一行进行排序。

library(dplyr)
df %>%
  transmute(Item_1 = pmin(Item1, Item2), 
            Item_2 = pmax(Item1, Item2), 
            Result) %>%
  distinct()

#  Item_1 Item_2 Result
#1      A      B    0.5
#2      C      D    0.1

在基数 R 中:

unique(transform(df, Item1 = pmin(Item1, Item2), 
                     Item2 = pmax(Item1, Item2)))

使用base


df <- structure(list(Item1 = c("A", "C", "B", "D", "E", "F"), 
                     Item2 = c("B", "D", "A", "C", "F", "E"), 
                     Result = c(0.5, 0.1, 0.5, 0.1, 0.7, 0.6)),
                class = "data.frame", row.names = c(NA, -6L))

fltr <- !duplicated(apply(df, 1, function(x) paste(sort(x), collapse = "")))

df[fltr, ]
#>   Item1 Item2 Result
#> 1     A     B    0.5
#> 2     C     D    0.1
#> 5     E     F    0.7
#> 6     F     E    0.6

reprex package (v0.3.0)

于 2021 年 1 月 15 日创建