【问题标题】:Count consecutive numbers in a vector计算向量中的连续数字
【发布时间】:2012-05-17 21:28:41
【问题描述】:

如果我有一个类似的向量

"a": 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0

我想知道a 中有多少个1,在这种情况下,答案是 3 和 2。

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

【问题讨论】:

  • 在搜索rle 的人的 2 天内,我至少看到了 3 个问题,这是一个不起眼的功能,但非常方便。

标签: r vector


【解决方案1】:

?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 也会找到正确的信息。
【解决方案2】:

这个怎么样?

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

【讨论】:

    【解决方案3】:

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

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

    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
    

    【讨论】:

    • 我认为 rle 是 inverse.rle 的反函数 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多