通过变量在1s和group之间计数0

通过变量在1s和group之间计数0,r,R,我有一些降水数据,我转换成二进制,其中1=降水事件,0=无降水。数据集有35000多个值,但以下是我的数据的示例: x = c(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. 我想计算连续无事件天数,因此我的输出如下所示: x = c(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

我有一些降水数据,我转换成二进制,其中1=降水事件,0=无降水。数据集有35000多个值,但以下是我的数据的示例:

x = c(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.
我想计算连续无事件天数,因此我的输出如下所示:

x = c(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.
我得到了以下答案,非常有效:

with(rle(x), length[!values])
#[1] 2 3 6 2
如果向量末尾有“0”,则可以从 从第一个1到最后一个1

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

根据您之前的回答,您可能只需要使用tapply函数。答案可能会返回一个列表

tapply(data$Event,list(data$Year),
   FUN=function(x) with(rle(x[Reduce(':',as.list(range(which(x==1))))]),lengths[!values]))
或者如果您已经完成了数据操作

    tapply(data$Event,list(data$Year), FUN=function(x) with(rle(x),lengths[!values]))

我们可以使用
data.table

library(data.table)
setDT(df1)[,{x1 <- Event[Reduce(':',as.list(range(which(Event==1))))]
  with(rle(x1), lengths[!values])  }, Year]
#   Year V1
#1: 1916  3
#2: 1916  3
#3: 1917  1
库(data.table)
setDT(df1)[,{x1
aggregate(事件~年份,数据=mydf,函数(x)与(rle(x),长度[!值]))
?A