【问题标题】:Finding longest repeating element in vector查找向量中最长的重复元素
【发布时间】:2015-05-14 01:04:42
【问题描述】:

我想在以下向量中找到等于“1”的连续重复元素的开始和结束索引。向量的值可以等于“1”或 NA。

例如:

out2
 [1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1"
[21] "1" NA  NA  NA  NA  NA  "1" "1" "1" "1" "1" "1" NA  NA  NA  NA  NA  NA  NA  NA

输出应如下所示

    [,1] [,2]
[1,]  1   21
[2,]  27  32

【问题讨论】:

  • out2 <- rep(c(1,NA,1,NA),c(21,5,6,8)) 会更容易使用。

标签: r vector


【解决方案1】:

试试rle:

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

with(rle(x), {
  ok <- !is.na(values)
  ends <- cumsum(lengths)[ok]
  starts <- ends - lengths[ok] + 1
  cbind(starts, ends)
})

给予:

     starts ends
[1,]      1   21
[2,]     27   32

【讨论】:

    【解决方案2】:

    您可以使用rle 获取游程编码,这使得这些“连续元素”分析相对简单:

    r <- rle(out2)
    cs <- cumsum(r$lengths)
    na.omit(cbind(cs[r$values == "1"] - r$length[r$values == "1"] + 1, cs[r$values == "1"]))
    #      [,1] [,2]
    # [1,]    1   21
    # [2,]   27   32
    

    rle 不喜欢 NA 值(每个值都被编码为长度为 1 的运行),因此如果您有例如 1 和 2 而不是 1 和不适用:

    out2 <- rep(c(1,2,1,2),c(21,5,6,8))
    r <- rle(out2)
    cs <- cumsum(r$lengths)
    cbind(cs[r$values == 1] - r$length[r$values == 1] + 1, cs[r$values == 1])
    #      [,1] [,2]
    # [1,]    1   21
    # [2,]   27   32
    

    【讨论】:

    • 您也可以将子集放在末尾:(cs + cbind(1-r$length,0))[!is.na(r$values)&amp;r$values==1,](cs+cbind(1-r$length,0))[r$values==1,]
    【解决方案3】:

    out2 &lt;- rep(c(1,NA,1,NA),c(21,5,6,8)) 上使用split

    spl <- split(seq_along(out2)[out2==1],cumsum(is.na(out2))[out2==1])
    sapply(spl, function(x) c(x[1],tail(x,1)))
    #      0  5
    #[1,]  1 27
    #[2,] 21 32
    

    rle 替代方案:

    r <- rle(is.na(out2))
    cbind(c(1,head(cumsum(r$l)[r$v],-1)+1),cumsum(r$l)[!r$v])
    #     [,1] [,2]
    #[1,]    1   21
    #[2,]   27   32
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-15
      • 2020-06-24
      • 2011-01-23
      • 2017-07-20
      • 2021-05-24
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      相关资源
      最近更新 更多