我有一些降水数据我转换成二进制,其中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
答案 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