【问题标题】:Remove all duplicate rows including the "reference" row [duplicate]删除所有重复的行,包括“参考”行[重复]
【发布时间】:2014-03-16 21:47:10
【问题描述】:

我正在寻找一种从向量中删除所有重复元素的方法,包括 reference 元素。 reference 元素是指当前用于比较的元素,以搜索其重复项。例如,如果我们考虑这个向量:

a = c(1,2,3,3,4,5,6,7,7,8) 

我想获得:

b = c(1,2,4,5,6,8)

我知道duplicated()unique(),但它们没有提供我正在寻找的结果。

【问题讨论】:

标签: r duplicate-removal


【解决方案1】:

这是一种方法:

a[!(duplicated(a) | rev(duplicated(rev(a))))]
# [1] 1 2 4 5 6 8

【讨论】:

  • 不错。看起来它正在做我需要的。谢谢你。希望它也适用于数据框,当然要指定哪一列。
  • 如果您指定列应该可以工作,可能像这样:df[!(duplicated(df$a) | rev(duplicated(rev(df$a)))), ]。请注意不要在整个 data.frame 上使用rev(df),因为这只会颠倒列(而不是行)的顺序。
  • 好的。会小心的 :] 再次感谢您。
【解决方案2】:

我问过自己同样的问题(我需要尽快解决),所以我想出了这些解决方案:

u =sample(x=1:10E6, size = 1000000, replace=T)
s1 <- function() setdiff(u, u[duplicated(u)])
s2 <- function() u[!duplicated(u) & !duplicated(u, fromLast=T)]
s3 <- function() u[!(duplicated(u) | rev(duplicated(rev(u))))]
s4 <- function() u[!u %in% u[duplicated(u)]]
s5 <- function() u[!match(u, u[duplicated(u)], nomatch = 0)]
s6 <- function() u[!is.element(u, u[duplicated(u)])]
s7 <- function() u[!duplicated2(u)]
library(rbenchmark)
benchmark(s1(), s2(), s3(), s4(), s5(), s6(), s7(),
          replications = 10,
          columns = c("test", "elapsed", "relative"),
          order = "elapsed")
     test elapsed relative
5 s5()    1.95    1.000
4 s4()    1.98    1.015
6 s6()    1.98    1.015
2 s2()    2.49    1.277
3 s3()    2.92    1.497
7 s7()    3.04    1.559
1 s1()    3.06    1.569

选择权在你。

【讨论】:

  • 感谢您写下实现此目的的几种方法。我发现查看完成任务所需的实际时间非常有用。我正在处理相当大的数据文件。
【解决方案3】:

这里有一个解决方案,可以找到重复出现及其“原始”出现(不仅是 duplicated 中的重复出现)。

duplicated2 <- function(x){
  dup <- duplicated(x)
  if (sum(dup) == 0)
    return(dup)
  duplicated(c(x[dup], x))[-(1:sum(dup))]
}


a <- c(1,2,3,3,4,5,6,7,7,8)

> a[!duplicated2(a)]
[1] 1 2 4 5 6 8

【讨论】:

  • 谢谢,但上面的解决方案更干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2011-04-16
  • 1970-01-01
  • 2011-06-24
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多