在向量中计算连续数字

10
如果我有一个向量,比如说:
"a": 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0

我想知道在字符串 a 中有多少个连续的 1,在这个例子中答案将是 3 和 2。
是否有任何脚本可以实现这个功能?

6
我在两天内看到至少三个人寻找"rle",这是一个很不常见的函数,但非常实用。 - Tyler Rinker
3个回答

21

请查看?rle

## create example vector
a <- c(rep(0, 3), rep(1, 3), rep(0, 4), rep(1, 2), rep(0, 3))

## count continuous values
r <- rle(a)

## fetch continuous length for value 1
r$lengths[r$values == 1]
# [1] 3 2

难道不应该使用values而不是value吗?使用$进行部分匹配可以找到正确的信息,但是使用rle(a)$v则会达到极端。 - thelatemail

7
这个怎么样?
test <- c(0,0,0,1,1,1,0,0,0,0,1,1,0,0,0)
rle(test)$lengths[rle(test)$values==1]
#[1] 3 2

对于大量数据,您可以使用一些复杂的选择来加快速度:

diff(unique(cumsum(test == 1)[test != 1]))
#[1] 3 2

5

其他人已经回答了这个问题。我只想补充两点观察:

数据输入技巧:使用扫描(默认为类“numeric”,不需要重复或逗号),如果你添加“character”作为参数,它也适用于由空格分隔的字符。

a <- scan()
1: 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0
16: 
Read 15 items

rle实际上是rep的反函数

 arle <- rle(a)
 rep(arle$values, arle$lengths)
 [1] 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0

2
我以为 rle 是 inverse.rle 的逆函数 ;) - Dason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接