如何在 R 中计算从 1 开始到下一个 1 之间的 0 的数量?

3

我有一些降水数据,已经转换成二进制形式,其中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.

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


1
我不理解这个。为什么这个问题太宽泛了? - Stibu
2个回答

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]) 

4
这是一个有些复杂的解决方案(但我认为它很有趣):
diff(c(0, cumsum(!x)[diff(x) == 1]))
diff(x) == 1 表示在每个1前面的最后一个零,将返回TRUEcumsum(!x) 返回一个向量,其中包含元素i,该元素表示在x[i]之前(包括x[i]x中包含的零的数量。最后,您需要再次使用diff(),因为您只需要自上一个1以来的零的数量。
该解决方案适用于前导零,但在末尾有零时会失败。可以通过确保最后一个数字始终为1来使其适应后一种情况。
y <- c(0, 0, 0, x, 0, 0, 0, 0)
diff(c(0, cumsum(!c(y,1))[diff(c(y,1)) == 1]))

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