将向量拆分为相等值的连续游程

乔纳斯

我有一个数据表,其中一列是一堆0和1,如下vec所示。

vec = c(rep(1, times = 6), rep(0, times = 10), rep(1, times = 11), rep(0, times = 4))

> vec
 [1] 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0

我想要做的是每次在该列中的数据从0更改为1时都将数据拆分,反之亦然。到目前为止,这是我所做的:

b = c(vec[1],diff(vec))

rowby = numeric(0)
for (i in 2:(length(b))) {
  if (b[i] != 0) {
    rowby <- c(rowby, i-1)
  } 
}
splitted_data <- split(vec, cumsum(c(TRUE,(1:length(vec) %in% rowby)[-length(vec)])))

我的鼻子下面一定有东西看不见。正确的方法是什么?这适用于上面的示例,但不适用于一般情况。

阿克伦

尝试

 split(vec,cumsum(c(1, abs(diff(vec)))))
 #$`1`
 #[1] 1 1 1 1 1 1

 #$`2`
 #[1] 0 0 0 0 0 0 0 0 0 0

 #$`3`
 #[1] 1 1 1 1 1 1 1 1 1 1 1

 #$`4`
 #[1] 0 0 0 0

或使用 rle

 split(vec,inverse.rle(within.list(rle(vec), values <- seq_along(values))))

在的最新版本中data.tablerleid是可以用于此工作的一个函数:

 library(data.table)#v1.9.5+
 split(vec,rleid(vec))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章