如何计算R中1之间的0的数量?

时间:2016-02-08 18:55:36

标签: r

我有一些降水数据我转换成二进制,其中1 =降水事件,0 =没有降水。数据集有超过35,000个值,但这里是我的数据的示例:

x = 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1.

我想计算没有事件的连续天数,所以我的输出看起来像这样:

y = 2, 3, 6, 2.

我尝试使用帮助网站,但没有一个建议的解决方案有效。

2 个答案:

答案 0 :(得分:7)

我们可以使用rle

with(rle(x), lengths[!values])
#[1] 2 3 6 2

如果我们在向量的末尾有' 0,我们可以从第1个到最后1个开始计数

x1 <- x[Reduce(':',as.list(range(which(x==1))))]
with(rle(x1), lengths[!values]) 

答案 1 :(得分:3)

这是一个有点复杂的解决方案(但我认为这很有趣):

diff(c(0, cumsum(!x)[diff(x) == 1]))

diff(x) == 1为每一个前一个零提供TRUEcumsum(!x)为您提供了一个向量,其中包含i中包含x的{​​0}}中包含{0}}的元素作为元素x[i]。最后,您需要再次diff(),因为您只需要自上一个以来的零个数。

该解决方案适用于前导零,但最后会以零为失败。它可以通过确保最后一个数字始终是一个来适应后一种情况:

y <- c(0, 0, 0, x, 0, 0, 0, 0)
diff(c(0, cumsum(!c(y,1))[diff(c(y,1)) == 1]))