【问题标题】:Determine if there are x consecutive duplicates in a vector in R确定R中的向量中是否有x个连续重复
【发布时间】:2015-03-14 06:08:03
【问题描述】:

我有以下向量:

p<-c(0,0,1,1,1,3,2,3,2,2,2,2)

我正在尝试编写一个函数,如果向量中有 x 个连续重复,则返回 TRUE。

函数调用found_duplications(p,3) 将返回True,因为有三个连续的1。函数调用found_duplications(p,5) 将返回 False,因为没有 5 个连续重复的数字。函数调用found_duplications(p,4) 将返回 True,因为有四个连续的 4。

我有几个想法。有duplicated()函数:

duplicated(p)
> [1] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

我可以创建一个 for 循环来计算向量中 TRUE 的数量,但问题是连续计数器会减一。你们能想到其他解决方案吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    你也可以

    find.dup <- function(x, n){
     n %in% rle(x)$lengths
    }
    
    find.dup(p,3)
    #[1] TRUE
    find.dup(p,2)
    #[1] TRUE
    find.dup(p,5)
    #[1] FALSE
    find.dup(p,4)
    #[1] TRUE
    

    【讨论】:

    • 哈!我知道有一个包裹可以做到这一点,但不记得是哪个包裹了。你这个人阿克伦! ;)
    • @DominicComtois rle 是一个 base R 函数。每当弹出与consecutive 数字相关的任何内容时,它都非常有用。
    • 哎呀,不是包。我知道它,过去使用它。但我的记忆无法适应所有语言的所有功能:D
    【解决方案2】:
    p<-c(0,0,1,1,1,3,2,3,2,2,2,2)
    
    find.dup <- function(x, n) {
      consec <- 1
      for(i in 2:length(x)) {
        if(x[i] == x[i-1]) {
          consec <- consec + 1
        } else {
          consec <- 1
        }
        if(consec == n)
          return(TRUE) # or you could return x[i]
      }
      return(FALSE)
    }
    
    find.dup(p,3)
    # [1] TRUE
    
    find.dup(p,4)
    # [1] TRUE
    
    find.dup(p,5)
    # [1] FALSE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多