R 将0和1的向量转换为组

R 将0和1的向量转换为组,r,R,我有一个0和1的向量,例如: x <- c(0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,1) 其中,后续的自然数将表示在该块的位置上原始向量的“一”块的数量。 基本上,我需要的解决方案,将计算速度快(x向量通常将至少>30k长,将有一个这样的多个向量在一次运行) 任何不涉及“for”循环的想法 我们可以使用rle inverse.rle(within.list(rle(x), values[values!=0] <- seq_along(values[values!

我有一个0和1的向量,例如:

x <- c(0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,1)
其中,后续的自然数将表示在该块的位置上原始向量的“一”块的数量。 基本上,我需要的解决方案,将计算速度快(x向量通常将至少>30k长,将有一个这样的多个向量在一次运行)


任何不涉及“for”循环的想法

我们可以使用
rle

inverse.rle(within.list(rle(x), values[values!=0] <- seq_along(values[values!=0])))
#[1] 0 0 1 1 1 0 0 0 0 0 2 2 2 0 0 3

这似乎是我能找到的最快的。本文和@akrun的答案中给出的所有选项,除了最庞大的向量外,都是几秒钟的分数

replace(x, x!=0, cumsum(diff(c(0,x)==1)[x!=0]) )
# [1] 0 0 1 1 1 0 0 0 0 0 2 2 2 0 0 3
还有一种可能毫无意义的方法:

replace(x, x!=0, factor(cumsum(x==0)[x!=0]) )
# [1] 0 0 1 1 1 0 0 0 0 0 2 2 2 0 0 3
replace(x, x!=0, cumsum(diff(c(0,x)==1)[x!=0]) )
# [1] 0 0 1 1 1 0 0 0 0 0 2 2 2 0 0 3
replace(x, x!=0, factor(cumsum(x==0)[x!=0]) )
# [1] 0 0 1 1 1 0 0 0 0 0 2 2 2 0 0 3