基于块长度向量的分割向量

Posted

技术标签:

【中文标题】基于块长度向量的分割向量【英文标题】: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,但如果有的话,我正在寻找一种更优雅的方法。

【问题讨论】:

【参考方案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"

【讨论】:

以上是关于基于块长度向量的分割向量的主要内容,如果未能解决你的问题,请参考以下文章

在Swift中平均分割一个大向量[重复]

matlab怎么计算线段的长度

向量与子向量长度 n 的组合

如何解决以下错误?输入必须是任意长度的字符向量或字符向量列表,每个字符向量的长度为1

Rcpp R 向量大小限制(不允许负长度向量)

向量运算与几何意义