2013-05-29 2 views
1

У меня есть вектор, составленный из 0 и 1. Он относится к ежечасным данным с данными: 0 = без дождя, 1 = событие дождя в течение соответствующего часа.Определение размера идентичных значений смещений в векторе

Целью является определение продолжительности всех событий дождя, то есть длины каждого блока из 1 с в векторе.

Есть ли что-нибудь лучше, чем цикл просеивания всех значений и neigthbours 1 на 1.

Заранее спасибо за вашу помощь. Всего наилучших, Vincent

+4

Я действительно думаю, что вам понравится функция 'rle'. – joran

+0

@joran, это определенно ответно-достойно. – huon

+0

@dbaupp У вопроса нет кода для работы, и когда мой единственный ответ - назвать функцию, я склонен просто оставить комментарий и позволить другим тратить время на разработку более сложных ответов. – joran

ответ

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 заменить эти 0s в пределах период между событиями с 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 
+0

@ Joran: действительно, мне нравится эта функция rle – allardvinc

+0

@ Matthew Большое спасибо за ваш четкий ответ. Вы даже ожидали моих потребностей! Всего наилучшего, Vincent – allardvinc

+0

@allardvinc вы можете. пожалуйста, не забудьте принять ответ, чтобы вопрос был разрешен. Благодарю. –