我有一个由0和1组成的向量。它指的是小时符合数据,0 =没有下雨,1 =相应小时内的下雨事件。
目标是确定所有降雨事件的持续时间,即向量中每个1s块的长度。
有什么比循环筛选所有值和neigthbours 1比1更好。
提前感谢您的帮助。 祝一切顺利, 文森特
答案 0 :(得分:3)
正如@joran所说,rle
就是你想要的。
hourly.rain <- c(0, 0, 1, 1, 0, 1, 0, 0, 1, 1)
with(rle(hourly.rain), lengths[values == 1])
#[1] 2 1 2
如果你想观察一个事件间的时间,比如说2个小时,(即2小时或更短的事件被认为是同一个事件),你也可以使用rle
替换那个0内的0。事件间期间为1秒。
inter.event <- 2
hourly.rain <- c(0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1)
with(rle(hourly.rain), {
fwd.lag <- c(head(values, -1), 1)
bkwd.lag <- c(1, tail(values, -1))
replace.vals <- values == 0 & lengths <= inter.event & fwd.lag == bkwd.lag
rep(replace(values, replace.vals, 1) , lengths)
})
# [1] 0 0 0 1 1 1 1 0 0 0 1 1 1 1