【问题标题】:Split a vector by its sequences [duplicate]按其序列拆分向量[重复]
【发布时间】:2014-09-11 17:49:35
【问题描述】:

以下向量x 包含两个序列1:46:7,以及其他非序列数字。

x <- c(7, 1:4, 6:7, 9)

我想按其序列拆分x,以便结果是如下列表。

# [[1]]
# [1] 7
#
# [[2]]
# [1] 1 2 3 4
#
# [[3]]
# [1] 6 7
#
# [[4]]
# [1] 9

有没有快速简单的方法来做到这一点?

我试过了

split(x, c(0, diff(x)))

这很接近,但我不觉得将0 附加到差异向量是正确的方法。使用findInterval 也不起作用。

【问题讨论】:

    标签: r


    【解决方案1】:
    split(x, cumsum(c(TRUE, diff(x)!=1)))
    #$`1`
    #[1] 7
    #
    #$`2`
    #[1] 1 2 3 4
    #
    #$`3`
    #[1] 6 7
    #
    #$`4`
    #[1] 9
    

    【讨论】:

    • 您能解释一下 diff() 函数的工作原理以及它在此解决方案中的作用吗? diff() 函数的官方文档并没有帮助我理解它。
    • 该函数只计算连续向量元素之间的所有差异。例如,比较 print(x &lt;- (1:5)^2)diff(x)。由于 OP 将序列定义为差值正好为 1 的值,因此我检查了不同于 1 的差值。查看(使用 OP 的数据)diff(x); diff(x)!=1; cumsum(c(TRUE, diff(x)!=1)).
    【解决方案2】:

    只是为了好玩,您可以从他的"cgwtools" package 中使用Carl Witthoft's seqle 函数。 (它不会像 Roland 的答案那样有效。)

    library(cgwtools)
    
    ## Here's what seqle does...
    ## It's like rle, but for sequences
    seqle(x)
    # Run Length Encoding
    #   lengths: int [1:4] 1 4 2 1
    #   values : num [1:4] 7 1 6 9
    
    y <- seqle(x)
    split(x, rep(seq_along(y$lengths), y$lengths))
    # $`1`
    # [1] 7
    # 
    # $`2`
    # [1] 1 2 3 4
    # 
    # $`3`
    # [1] 6 7
    # 
    # $`4`
    # [1] 9
    

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多