【问题标题】:How can I remove duplicate values by looking at other column values in the data frame?如何通过查看数据框中的其他列值来删除重复值?
【发布时间】:2021-12-05 04:27:58
【问题描述】:

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

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

像这样……

我该怎么办?

【问题讨论】:

    标签: r dataframe duplicates row identity-column


    【解决方案1】:

    我正在举一个更笼统的案例

    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
    

    【讨论】:

      【解决方案2】:

      您可以使用pminpmax 按字母顺序对值进行排序并选择唯一的行。

      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)))
      

      【讨论】:

      • 平行最小值/最大值的良好用法。但我认为这些可能会改变找不到重复/镜像图像的列的顺序!请检查
      • 是的,这是真的,但我不确定 1) 是否存在这种情况。 2) 如果存在 OP 在这种情况下想要做的事情(因为 A-&gt;B 被选中而不是 B-&gt;A)。看看这个例子,我猜一个项目是否被归类为item1item2 并不重要,但我可能错了。
      • 同意。但我通常将 SO 用于我的 R/Tableau 学习,因此,我概括了可能发生的情况。此外,我一直在寻找您解决此问题的绝妙方法,这就是我问的原因。希望你能积极接受。谢谢
      • @AnilGoyal 嘿,指出您在我的回答中发现的任何错误/假设,以提高帖子的质量。
      【解决方案3】:

      使用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-01-15 创建

      【讨论】:

        猜你喜欢
        • 2021-09-25
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 2017-12-16
        • 2016-04-29
        • 2023-01-11
        相关资源
        最近更新 更多