我有一个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;的想法。循环?
答案 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