2016-07-09 28 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-让 - 一个伟大-R-重复性,例如#答案-5963610)。然后相应地编辑并改进它。一个好的帖子通常会提供*最小*输入数据,所需的输出数据和一些代码尝试 - 所有*复制粘贴运行*。它也使用适当的SO格式。海报应该扔掉任何压载物。如果可能的话,从你的问题摘要中减少你的ex。数据集和代码,同时保持完全的可重复性,一次只关注一个问题,并确保有一个突出的问题。 – lukeA

回答

0

我使用了一个更简单的方法来打破的降雨量数据为基础的30分钟最小间活动时间(MIT)的事件。这里是我的代码:

# 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. 

希望有所帮助。