我有一个数据表,其中一列是一堆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)])))
我的鼻子下面肯定有一些我无法看到的东西。这样做的正确方法是什么?这适用于上面的例子,但不是一般的。
答案 0 :(得分:6)
尝试
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.table
的当前版本,rleid
是一个可用于此作业的函数:
library(data.table)#v1.9.5+
split(vec,rleid(vec))