我有一些降水数据我转换成二进制,其中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.
我尝试使用帮助网站,但没有一个建议的解决方案有效。
答案 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
为每一个前一个零提供TRUE
。 cumsum(!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]))