【问题标题】:Conditionally removing duplicates有条件地删除重复项
【发布时间】:2018-02-17 13:07:59
【问题描述】:

我有一个数据集,我需要根据另一列中的值有条件地删除重复的行。

具体来说,我需要删除size = 0 的任何行,只有当SampleID重复

SampleID<-c("a", "a", "b", "b", "b", "c", "d", "d", "e")
size<-c(0, 1, 1, 2, 3, 0, 0, 1, 0)
data<-data.frame(SampleID, size)

我想删除行:

Sample ID   size
a           0
d           0

并保持:

SampleID   size
a          1
b          1
b          2
b          3
c          0
d          1
e          0

注意。实际数据集非常大,所以我不是在寻找一种方法来逐行删除已知行。

【问题讨论】:

  • 请阅读:stackoverflow.com/help/how-to-ask 并创建可重现的示例。
  • 澄清最后一条评论:您提供的代码无法运行。发布前在新的 R 会话中测试示例。

标签: r dataframe duplicates subset


【解决方案1】:

在没有 data.table 的基础 R 中工作的解决方案,对于 R 初学者来说很容易遵循:

#Find all duplicates

data$dup1 <- duplicated(data$SampleID)
data$dup2 <- duplicated(data$SampleID, fromLast = TRUE)
data$dup <- ifelse(data$dup1 == TRUE | data$dup2 == TRUE, 1, 0)


#Subset to relevant

data$drop <- ifelse(data$dup == 1 & data$size == 0, 1, 0)
data2 <- subset(data, drop == 0)

【讨论】:

    【解决方案2】:

    使用data.table 框架:将您的集合转换为data.table

    require(data.table)
    setDT(data)
    

    建立一个我们可以删除行的id列表:

    dropable_ids = unique(data[size != 0, SampleID])
    

    最后保留不在可放置列表中或具有非 0 值的行

    data = data[!(SampleID %in% dropable_ids & size == 0), ]
    

    请注意not( a and b ) 等价于a or b,但data.table 框架不能很好地处理or

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      dplyr 中,我们可以使用group_byfilter 来做到这一点:

      library(dplyr)
      
      data %>% 
        group_by(SampleID) %>% 
        filter(!(size==0 & n() > 1)) # filter(size!=0 | n() == 1)) 
      
      #> # A tibble: 7 x 2
      #> # Groups:   SampleID [5]
      #>   SampleID  size
      #>   <fct>    <dbl>
      #> 1 a            1
      #> 2 b            1
      #> 3 b            2
      #> 4 b            3
      #> 5 c            0
      #> 6 d            1
      #> 7 e            0
      

      【讨论】:

        猜你喜欢
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 2019-02-02
        • 2020-05-22
        • 2021-01-23
        • 2015-07-17
        • 2017-10-23
        相关资源
        最近更新 更多