【问题标题】:Splitting vector based on vector of chunk-lengths基于块长度向量的分割向量
【发布时间】:2015-03-01 06:27:14
【问题描述】:

我有一个二进制数向量。我知道每组对象的连续长度;如何根据该信息进行拆分(没有 for 循环)?

x = c("1","0","1","0","0","0","0","0","1")
.length = c(group1 = 2,group2=4, group3=3)

x 是我需要拆分的二进制数向量。 .length 是给我的信息。 .length 基本上告诉我第一组有 2 个元素,它们是前两个元素 1,0。第二组具有4 元素,并包含组1 数字、1,0,0,0 等后面的4 个数字。

有没有办法将其拆分并将拆分后的项目返回到列表中?

丑陋的方法是通过 for 循环跟踪当前的 cumsum,但如果有的话,我正在寻找一种更优雅的方法。

【问题讨论】:

    标签: r chunks


    【解决方案1】:

    另一种选择是

    split(x,cumsum(sequence(.length)==1))
    #$`1`
    #[1] "1" "0"
    
    #$`2`
    #[1] "1" "0" "0" "0"
    
    #$`3`
    #[1] "0" "0" "1"
    

    获取group names

    split(x, sub('.$', '', names(sequence(.length))))
    #$group1
    #[1] "1" "0"
    
    #$group2
    #[1] "1" "0" "0" "0"
    
    #$group3
    #[1] "0" "0" "1"
    

    【讨论】:

      【解决方案2】:

      你可以使用rep设置分割变量,使用split

      x = c("1","0","1","0","0","0","0","0","1")
      .length = c(group1 = 2,group2=4, group3=3)
      
      split(x, rep.int(seq_along(.length), .length))
      # $`1`
      # [1] "1" "0"
      #
      # $`2`
      # [1] "1" "0" "0" "0"
      #
      # $`3`
      # [1] "0" "0" "1"
      

      如果您想将组名带到拆分列表中,您可以更改 rep 以复制名称

      split(x, rep.int(names(.length), .length))
      # $group1
      # [1] "1" "0"
      #
      # $group2
      # [1] "1" "0" "0" "0"
      #
      # $group3
      # [1] "0" "0" "1"
      

      【讨论】:

        猜你喜欢
        • 2021-12-16
        • 1970-01-01
        • 2014-07-03
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多