我有一个由 0 和 1 组成的向量。它指的是每小时遇到的数据,0 = 无雨,1 = 相应小时内的降雨事件。
目标是确定所有降雨事件的持续时间,即向量中每个 1 块的长度。
有什么比循环筛选所有值和邻居 1 比 1 更好的方法。
在此先感谢您的帮助。一切顺利,文森特
我有一个由 0 和 1 组成的向量。它指的是每小时遇到的数据,0 = 无雨,1 = 相应小时内的降雨事件。
目标是确定所有降雨事件的持续时间,即向量中每个 1 块的长度。
有什么比循环筛选所有值和邻居 1 比 1 更好的方法。
在此先感谢您的帮助。一切顺利,文森特
正如@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
1 替换事件间期间内的那些 0。
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