【问题标题】:Remove duplicate rows based on multiple columns using dplyr / tidyverse?使用 dplyr / tidyverse 删除基于多列的重复行?
【发布时间】:2020-07-06 17:45:02
【问题描述】:

我想使用 dplyr / tidyverse 删除基于 >1 列的重复行

示例

library(dplyr)

df <- data.frame(a=c(1,1,1,2,2,2), b=c(1,2,1,2,1,2), stringsAsFactors = F)

我认为这将返回第 3 行和第 6 行,但它返回 0 行。

df %>% filter(duplicated(a, b))
# [1] a b
# <0 rows> (or 0-length row.names)

相反,我认为这会返回第 1、2、4 和 5 行,但它会返回所有行。

df %>% filter(!duplicated(a, b))
#   a b
# 1 1 1
# 2 1 2
# 3 1 1
# 4 2 2
# 5 2 1
# 6 2 2

我错过了什么?

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    在数据框上使用 unique 会给出唯一的行。

    unique(df)
    
    #  a b
    #1 1 1
    #2 1 2
    #4 2 2
    #5 2 1
    

    或者,一个整洁的方法可能是选择每个组的第一行。

    library(dplyr)
    
    df %>% group_by(a, b) %>% slice(1L) 
    #If only 2 columns
    #df %>% group_by_all() %>%slice(1L)
    
    #      a     b
    #  <dbl> <dbl>
    #1     1     1
    #2     1     2
    #3     2     1
    #4     2     2
    

    反过来是:

    df %>%  group_by(a, b) %>% filter(n() > 1) %>%  distinct()
    #If only 2 columns
    #df %>%  group_by_all() %>% filter(n() > 1) %>%  distinct()
    
    #     a     b
    #  <dbl> <dbl>
    #1     1     1
    #2     2     2
    

    【讨论】:

      【解决方案2】:

      duplicated 期望对“一个向量或一个数据框或一个数组”(但不是两个向量...它在第一个查找重复仅论据)。

      df %>%
        filter(duplicated(.))
      #   a b
      # 1 1 1
      # 2 2 2
      
      df %>%
        filter(!duplicated(.))
      #   a b
      # 1 1 1
      # 2 1 2
      # 3 2 2
      # 4 2 1
      

      如果您希望引用特定的列子集,请使用cbind

      df %>%
        filter(duplicated(cbind(a, b)))
      

      作为旁注,dplyr 动词可以是 distinct

      df %>%
        distinct(a, b, .keep_all = TRUE)
      #   a b
      # 1 1 1
      # 2 1 2
      # 3 2 2
      # 4 2 1
      

      虽然我不知道它有这个函数的逆函数。

      【讨论】:

      • 非常好。另外,我认为cbind 方法在一些罕见的情况下会失败,比如df &lt;- data.frame(a=c(11, 1), b=c(1,12), stringsAsFactors = F); df %&gt;% filter(duplicated(cbind(a, b))),但事实并非如此。看起来是个不错的解决方案。
      • 自从您编辑后,我将使用distinct,因为这是最“原生”的整洁方法。渴望知道是否有相反的情况,只是为了学习/知识
      • 可能是janitor::get_dupes?
      • 我不需要那个包。
      猜你喜欢
      • 2016-10-04
      • 2013-06-13
      • 1970-01-01
      • 2023-03-09
      • 2021-11-03
      • 2014-05-22
      • 2022-01-24
      • 1970-01-01
      相关资源
      最近更新 更多