2016-07-09 1 views
0

У меня есть данные о дождевых осадках, которые я разделил по годам на матрицы. Матрицы находятся в списке под названием tenyr.matrix.list. Я хочу разделить данные о дождевых осадках на события, основанные на межведомственном периоде в 6 часов.Разбиение временных рядов данных на события в R (повтор/цикл)

Код, приведенный ниже, является моей попыткой. Я использовал маску для определения следующего значения 0 или следующего значения, которое не равно нулю для определения конца и начала событий. Затем я использовал цикл повтора, чтобы повторить этот процесс до тех пор, пока не будет 6-часовой промежуток между окончанием события и началом следующего события (если есть события, близкие друг к другу, которые содержат 0 между ними).

Это работает, если в событиях нет пробелов, однако там, где есть пробелы, код печатает только конец события за пределами нулевого значения, а не предшествующие значения.

например. Если событие:

2006/12/12 07.00 5; 2006/12/12 08.00 10; 2006/12/12 09.00 7; 
2006/12/12 10.00 3; 2006/12/12 11.00 1. 

Вот что код печатает.

Однако если событие:

2006/12/12 07.00 5, 2006/12/12 08.00 0, 2006/12/12 09.00 7, 2006/12/12 
10.00 3, 2006/12/12 11.00 1. 

Кодовые печатает только вторую часть за нуль: 2006/12/12 09.00 7, 2006/12/12 10.00 3, 2006/12/12 11.00 1.

Может кто-нибудь объяснить, что мне не хватает?

mask <- (tenyr_matrix.list[[j]]) #create a mask matrix 
for (x in c(1:68)){ 
    firstnonzero <- which(mask[,2]!=0 & mask[,2]!=9999)[1] #first nonzero 
    repeat { 
     nonzero <- which(mask[,2]!=0 & mask[,2]!=9999)[1] #nonzero 
     mask[1:nonzero,2]=9999 #set values up to nonzero to 9999 
     zero <- which(mask[,2]==0)[1] #first zero after event 
     mask[1:zero,2]=9999 #set values up to zero to 9999 
     nonzero2 <- which(mask[,2]!=0 & mask[,2]!=9999)[1] #find next nonzero 
     #mask[1:nonzero2,2]=9999 #set values up to zero to 9999 

     if (((tenyr_matrix.list[[j]][nonzero2,1]-tenyr_matrix.list[[j]] [zero-1,1])/(60*60))>=6 | is.na(nonzero2)) 
     print(tenyr_matrix.list[[j]][firstnonzero:(zero-1),]) 
     break 
    } 
} #end of x 
+2

дайте небольшой пример представительных данных. ПОЖАЛУЙСТА, пожалуйста, сделайте свой текст коротким! вы можете привести пример, чтобы человек, который не знает вашу проблему, следует вашему вопросу. – Learner

+3

Пожалуйста, прочитайте [как предоставить минимальные воспроизводимые примеры в R] (http://stackoverflow.com/questions/5963269/how-to- Make-A-пра-р-воспроизводимая-пример # ответ-5963610). Затем отредактируйте и улучшите его соответствующим образом. Хороший пост обычно обеспечивает * минимальные * входные данные, желаемые выходные данные и некоторые попытки кода - все * copy-paste-run'able *. Он также использует правильные SO-формы. Плакат должен сбросить балласт. Резюме из вашей проблемы, если это возможно, сводит к минимуму ваш ex. набора данных и кода, сохраняя при этом полную воспроизводимость, сосредоточьтесь на одной проблеме одновременно и убедитесь, что есть вопрос, который выделяется. – lukeA

ответ

0

я использовал гораздо более простой подход к разорвать данных осадков в события на основе минимального времени Inter-Event (MIT) 30 минут. Вот мой код:

# rainfall data contained in dataframe called RainData, of two columns: column 1 is time stamp in POSIXct format, column 2 is rainfall depth. My data is collected at two minute intervals. 

Rain_Over_0<- RainData[RainData[,2]!=0,] 

# Create vector increasing by 1 as Diff=>30 (Time specific) # change value of Diff here to change the MIT. 

Rainindex<-c(0,cumsum(diff(Rain_Over_0[,1])>30)) # input your value of MIT (in minutes) where the code says 30. 

# Split into list of events 

RainEvents<-split(Rain_Over_0, Rainindex) # this returns a list of events. You can then use sapply functions to determine the rain statistics you need. 

Надеюсь, что это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^