【问题标题】:R: Removing duplicate elements in a vector [duplicate]R:删除向量中的重复元素[重复]
【发布时间】:2016-09-19 18:06:35
【问题描述】:

我有一个这样的向量:

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

> x
 [1] 1 2 3 4 5 6 4 5 6 7

我想摆脱重复并得到这样的东西:

> [1] 1 2 3 7 

我的尝试

y = x[duplicated(x)]

> y
[1] 4 5 6

> x[x!=y]
[1] 1 2 3 7
Warning message:
In x != y : longer object length is not a multiple of shorter object length
> 

我做错了什么?

这个错误是我应该担心的吗?

有没有其他方法可以做到这一点而不会出错?

【问题讨论】:

  • 由于这里y是一个向量,所以需要使用%in%操作符。 x[!(x %in% y)]
  • 欢迎来到 SO!您的问题很好,但包含不当之处。在编程中,“双”元素通常是指存储为双精度浮点数的数字,而不是“重复”。您会注意到,您的原始标签 double 指的是 double 一词的这种含义,而不是您的意思。 en.wikipedia.org/wiki/Double-precision_floating-point_format
  • @Psidom:谢谢,正是我需要的!
  • @Hugh:是的,我不知道如何表达我的问题。感谢您提供有用的提示 - 请记住这一点!
  • 我能问一下这个问题的上下文吗?部分我怀疑这里有 X-Y 问题。

标签: r vector filter


【解决方案1】:

与您的代码一样简单,但使用[!x%in%y] 而不是[x!=y]

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

y <- x[duplicated(x)]

z <- x[!x%in%y]

print(z)
[1] 1 2 3 7

【讨论】:

    【解决方案2】:

    这是一个单独使用duplicated的方法

    x[!(duplicated(x)|duplicated(x, fromLast=TRUE))]
    #[1] 1 2 3 7
    

    【讨论】:

    • 不错的答案。我对这样的东西使用了一个非常相似的函数......x[duplicated(x) + duplicated(x, fromLast = TRUE)==0].
    【解决方案3】:

    使用不会给您警告消息的基本 R 的简单方法。

    编辑:@Hugh 的建议提供了更灵活的答案

    y = as.numeric(names(which(table(x)==1)))
    
    y
    [1] 1 2 3 7
    

    【讨论】:

    • 不太正确。在x &lt;- c(-1, -1, 2, 8, 8, 15) 上使用您的方法会返回2 4。我认为您想要x[which(table(x) == 1)]值而不是索引)。
    • 不幸的是,在我得到的原始问题上尝试这样做:1 2 3 4
    • 抱歉,我的建议是错误的,要获取值应该是as.numeric(names(table(x))[table(x) == 1])。除非 OP 想要索引,否则我认为您的答案目前不正确。
    • 不用担心,我应该对我的答案进行更多压力测试 - 感谢您指出这一点!我认为这也适用y = as.numeric(names((which(table(x)==1))))
    • 这就是 cmets 的用途! :-)
    【解决方案4】:

    请注意在测试中使用连续数字!

    x <- c(1,2,3,4,5,6,4,5,6,7)
    x1 <- c(-1, -1, 2, 8, 8, 15)
    
    keep_singles <- function(v){
      v[!(v %in% v[duplicated(v)])] 
    }
    
    keep_singles(x)
    
    [1] 1 2 3 7
    
    keep_singles(x1)
    
    [1]  2 15
    

    【讨论】:

    • Ahhh 除了我的答案之外,我只想发布这个答案,但你打败了我!绝对是更清洁的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2014-11-21
    相关资源
    最近更新 更多