在1之间计数0并按变量计数

时间:2016-02-09 13:34:20

标签: r

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

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

现在,我的问题是:有没有办法在按年分组数据时执行此操作?以下是我的数据集中的示例:

 Event  Year
  1    1916
  1    1916
  0    1916
  0    1916
  0    1916
  1    1916
  0    1916
  0    1916
  0    1916
  1    1916
  0    1917
  0    1917
  0    1917
  0    1917
  0    1917
  1    1917
  0    1917
  1    1917
  1    1917
  1    1917

2 个答案:

答案 0 :(得分:1)

根据您之前的回答,您可以使用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]))

答案 1 :(得分:1)

我们可以使用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