将零和一的向量转换为组

时间:2016-06-24 09:07:34

标签: r

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

x <- c(0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,1)

我需要将此向量转换为另一种形式:

c(0,0,1,1,1,0,0,0,0,2,2,2,0,0,3)

其中随后的自然数将指示&#39;的块数。从原始向量在该块的位置。 基本上我需要能够快速计算的解决方案(x向量通常至少大于30k,并且在一次运行中会出现这样的多个向量)。

任何不涉及&#39;的想法。循环?

2 个答案:

答案 0 :(得分:4)

这似乎和我能找到的一样快。除了最大的向量之外,所有选项和@ 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

答案 1 :(得分:3)

我们可以使用#old api cursor = self._cr #new api everything is contained in env (the environment) self.env.cr #api v7 def foo(self, cr, uid, ids, context=None): #you can use cr here instead of self._cr because it is explicitly passed to the method # api v8 def foo(self): # you don't need to pass in cr, uid, ids and context

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

rleid
data.table