【问题标题】:How to test whether a vector contains repetitive elements?如何测试向量是否包含重复元素?
【发布时间】:2011-03-10 17:35:53
【问题描述】:

如何测试向量是否包含 R 中的重复元素?

【问题讨论】:

    标签: r vector


    【解决方案1】:

    我想我找到了答案。使用 duplicated() 函数:

    a=c(3,5,7,2,7,9)
    b=1:10
    any(duplicated(a)) #True
    any(duplicated(b)) #False
    

    【讨论】:

    • anyDuplicated 对于非常长的向量会更快一些 - 它可以在找到第一个重复项时终止。
    • 我觉得 anyDuplicated() 的使用有点奇怪。它返回一个长度为 1 的整数,其值为第一个副本的从 1 开始的索引或 0。因此,any(duplicated(a)) 的等价物应该是 anyDuplicated(a) ==0。如果有任何重复,anyDuplicated() 返回 TRUE 会更直观。
    【解决方案2】:

    还可以尝试rle(x) 查找x 中相同值的运行长度。

    【讨论】:

      【解决方案3】:

      如果您正在寻找连续重复,您可以使用diff

      a <- 1:10
      b <- c(1:5, 5, 7, 8, 9, 10)
      diff(a)
      diff(b)
      

      或向量中的任何地方:

      length(a) == length(unique(a))
      length(b) == length(unique(b))
      

      【讨论】:

        【解决方案4】:

        检查一下:

        > all(diff(c(1,2,3)))
        [1] TRUE
        Warning message:
        In all(diff(c(1, 2, 3))) : coercing argument of type 'double' to logical
        > all(diff(c(1,2,2,3)))
        [1] FALSE
        Warning message:
        In all(diff(sort(c(1, 2, 4, 2, 3)))) : coercing argument of type 'double' to logical
        

        您可以添加一些强制转换来消除警告。

        【讨论】:

          【解决方案5】:

          正如哈德利在评论部分提到的:

          anyDuplicated 对于很长的向量会更快一些 - 它可以在找到第一个重复项时终止。

          例子

          a=c(3,5,7,2,7,9)
          b=1:10
          anyDuplicated(b) != 0L # TRUE
          anyDuplicated(b) != 0L # FALSE
          

          100 万次观察的基准:

          set.seed(2011)
          x <- sample(1e7, size = 1e6, replace = TRUE)
          bench::mark(
            ZNN = any(duplicated(x)),
            RL = length(x) != length(unique(x)),
            BUA = !all(diff(sort(x))),
            AD = anyDuplicated(x) != 0L
          )
          
          # A tibble: 4 x 13
            expression      min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time result    memory            time     gc                
            <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm> <list>    <list>            <list>   <list>            
          1 ZNN         64.62ms  70.04ms      11.5    11.8MB     0        8     0      693ms <lgl [1]> <df[,3] [2 x 3]>  <bch:tm> <tibble [8 x 3]>  
          2 RL          66.95ms  70.67ms      12.5    15.4MB     0        7     0      561ms <lgl [1]> <df[,3] [3 x 3]>  <bch:tm> <tibble [7 x 3]>  
          3 BUA         84.66ms  87.79ms      10.6      42MB     3.54     3     1      283ms <lgl [1]> <df[,3] [11 x 3]> <bch:tm> <tibble [4 x 3]>  
          4 AD           2.45ms   2.87ms     314.        8MB     5.98   105     2      335ms <lgl [1]> <df[,3] [1 x 3]>  <bch:tm> <tibble [107 x 3]>
          

          100 个观察值的基准

          set.seed(2011)
          x <- sample(1e7, size = 100, replace = TRUE)
          
          bench::mark(
            ZNN = any(duplicated(x)),
            RL = length(x) != length(unique(x)),
            BUA = !all(diff(sort(x))),
            AD = anyDuplicated(x) != 0L
          )
          
          # A tibble: 4 x 13
            expression      min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time result    memory            time     gc                   
            <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm> <list>    <list>            <list>   <list>               
          1 ZNN          7.14us   8.93us    60429.    1.48KB     6.04  9999     1    165.5ms <lgl [1]> <df[,3] [2 x 3]>  <bch:tm> <tibble [10,000 x 3]>
          2 RL           8.03us   9.37us    83754.    1.92KB     0    10000     0    119.4ms <lgl [1]> <df[,3] [3 x 3]>  <bch:tm> <tibble [10,000 x 3]>
          3 BUA         54.89us  61.58us     8317.    4.83KB     6.74  3701     3      445ms <lgl [1]> <df[,3] [11 x 3]> <bch:tm> <tibble [3,704 x 3]> 
          4 AD            5.8us   6.69us   123838.    1.05KB     0    10000     0     80.8ms <lgl [1]> <df[,3] [1 x 3]>  <bch:tm> <tibble [10,000 x 3]>
          

          【讨论】:

            猜你喜欢
            • 2010-11-13
            • 1970-01-01
            • 1970-01-01
            • 2018-11-13
            相关资源
            最近更新 更多