计算向量中的连续数字

Sim*_*mon 8 r vector

如果我有一个矢量

"a": 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0
Run Code Online (Sandbox Code Playgroud)

我想知道有多少1人在一起a,在这种情况下答案是3和2.

有没有可以做到这一点的脚本?

sgi*_*ibb 18

?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
Run Code Online (Sandbox Code Playgroud)


the*_*ail 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
Run Code Online (Sandbox Code Playgroud)

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

diff(unique(cumsum(test == 1)[test != 1]))
#[1] 3 2
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 5

其他人回答了这个问题.我想补充两点意见:

数据输入技巧:使用scan(默认为"numeric"类,不需要rep或逗号),如果添加"character"作为参数,它也适用于由空格分隔的字符.

a <- scan()
1: 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0
16: 
Read 15 items
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 我认为rle是inverse.rle的反函数;) (2认同)