【问题标题】:Delete all duplicated rows in R删除R中所有重复的行
【发布时间】:2014-07-22 08:01:58
【问题描述】:

我有一个有重复观察的data.frame,我如何删除所有重复的基于第一列(如果他们的第一个数据相同,然后完全删除这些条目)?

> a=c(1,4,5,5,6,6)
> b=c(2,5,7,4,4,2)
> c=c("a","b","c","a","b","c")
> test=data.frame(a,b,c)
> test
  a b c
1 1 2 a
2 4 5 b
3 5 7 c
4 5 4 a
5 6 4 b
6 6 2 c

我不想保留任何重复的行,以便我的最终输出是

  a b c
1 1 2 a
2 4 5 b

我尝试过uniqueduplicate 函数,但它们都保留了第一个重复行(即,如果有 5 条重复记录,则其中 4 条将被删除),例如

  a b c
1 1 2 a
2 4 5 b
3 5 7 c
4 6 4 b

我该怎么办?谢谢!

【问题讨论】:

  • 我不明白为什么你的最终输出应该是这样的。我不明白你为什么认为其他行是重复的
  • 6 4 b 是如何重复的?为什么要删除它
  • @Pop 我的意思是基于第一列的重复项。第 3 行和第 4 行的 [,1] 为 5,第 5 行和第 6 行的 [,1] 为 6。
  • @Floo0 因为下一行6 2 c也以6开头。

标签: r


【解决方案1】:

您可以使用table() 获取您的列的频率表,然后将结果用于子集:

singletons <- names(which(table(test$a) == 1))
test[test$a %in% singletons, ]

  a b c
1 1 2 a
2 4 5 b

【讨论】:

    【解决方案2】:

    使用dplyr

    require(dplyr)
    test <- test %>% group_by(a) %>% filter(n()==1)
    test
    
      a b c
    1 1 2 a
    2 4 5 b
    

    【讨论】:

    • 谢谢,它也有效!其实我之前对dplyr一无所知。安德烈先回答,所以我接受了他的回答。再次感谢!
    【解决方案3】:

    您首先搜索重复行的第一列值:

    val <- test[duplicated(test[,1]),1]
    [1] 5 6
    

    然后搜索可以找到这些值的行

    rows <- test[,1] %in% test[duplicated(test[,1]),1]
    [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE
    

    然后选择除这些之外的所有行:

    test[! rows,]
      a b c
    1 1 2 a
    2 4 5 b
    

    【讨论】:

      【解决方案4】:

      奇怪的请求,但是如果您想删除任何列中存在重复的所有行而忽略其他列:

      test[!duplicated(test$a) & ! duplicated(test$b) & ! duplicated(test$c),]
        a b c
      1 1 2 a
      2 4 5 b
      3 5 7 c
      

      但我看不出 '5 7 c' 在您的示例中是如何重复的。

      【讨论】:

      • 因为下一行 5 4 a 也是以 5 开头的。无论如何谢谢!
      【解决方案5】:

      简单的一步删除重复项:

      my_df <- my_df[-which(duplicated(my_df)), ]
      

      【讨论】:

        猜你喜欢
        • 2016-06-01
        • 2016-01-20
        • 2012-11-19
        • 2022-01-23
        • 2016-07-27
        • 2011-04-16
        • 1970-01-01
        • 2013-04-08
        • 1970-01-01
        相关资源
        最近更新 更多