【问题标题】:How Do I Find Consecutive Values我如何找到连续的值
【发布时间】:2020-02-05 14:13:54
【问题描述】:

假设我有这个向量:

x <- c(1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0)

我想找出我们连续 ¨1¨ 3 次的次数。 为此,我正在使用此代码-

n.hot <- which(df, df$vector = 1,1,1)

我该怎么做才能让它真正发挥作用? 谢谢

【问题讨论】:

  • 你想要的输出是什么?另外,如果你连续有 4 个 1,它算一次还是两次(即所有匹配连续 3 个,或至少连续 3 个)?

标签: r dataframe vector


【解决方案1】:

如果1 1 1 1 对您来说意味着1 1 1 实际上出现了两次,您可以这样做:

sum(stats::filter(x, c(1, 1, 1), circular = TRUE, sides = 2) == 3)

[1] 7

【讨论】:

    【解决方案2】:

    一个选项可能是:

    sum(with(rle(x), lengths[as.logical(values)]) == 3)
    
    [1] 2
    

    【讨论】:

      【解决方案3】:

      你可以计算滚动和,如果它等于 3,你就知道这是你想要的。

      library(zoo)
      
      x <- c(1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0)
      
      threetogether <- rollsum(x, 3, fill = NA, align = "right")
      
      threetogether == 3
      

      输出:

       [1]    NA    NA FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
      

      【讨论】:

      • 建议使用rollsumr,以r 结尾代替align = "right"fill = 0,这样前两个元素就会变为FALSE。
      【解决方案4】:

      这是另一个(不太传统的)想法,

      sum(tapply(x, cumsum(x != 1), FUN = length) == 4)
      #[1] 2
      

      【讨论】:

        【解决方案5】:

        如果你想要三个连续的 1,或者如果你想要至少三个连续的 1,这里是一个使用基本 R 解决方案的函数,它利用 cumsum()(和 diff()。这只是偏移了 cumsum 向量来比较 if有n 连续的。现在它被设计用于逻辑向量或0/1 向量。而且,如果你有"at least" 作为类型,它将选择第一个匹配,但很容易适应选择最后一个如果你愿意的话。

        consecutive_n <- function(vector, n, type = c("equal", "at least")) {
        
          length_vec <- length(vector)
          cumsum_vec <- cumsum(vector)
        
          difference <- cumsum_vec - c(rep(0, n), cumsum(vector)[-c((length_vec-n+1):length_vec)]) == n
        
          type <- match.arg(type)
        
          if(type == "equal") {
            difference & c(0, diff(difference)) == 1
          } else {
            difference
          } 
        
        }
        
        consecutive_n(x, 3)
        [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
        sum(consecutive_n(x, 3))
        [1] 4
        which(consecutive_n(x, 3))
        [1]  5 10 14 21
        
        sum(consecutive_n(x, 3, type = "at least"))
        [1] 7
        which(consecutive_n(x, 3, type = "at least"))
        [1]  5  6 10 14 15 16 21
        

        数据

        x <- c(1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0)
        

        【讨论】:

          猜你喜欢
          • 2017-03-25
          • 1970-01-01
          • 2018-06-10
          • 2018-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-18
          相关资源
          最近更新 更多