将时间序列数据拆分为R中的事件(重复/循环)

时间:2016-07-09 10:52:02

标签: r loops time-series repeat

我有每小时的降雨数据,我按年分成矩阵。矩阵位于名为tenyr.matrix.list的列表中。我想根据6小时的事件间期将降雨量数据划分为事件。

以下代码是我的尝试。我使用了一个掩码来识别下一个0值或下一个非零值,以定义事件的结束和开始。然后我使用了一个重复循环来重复这个过程,直到事件结束和下一个事件开始之间有6小时的间隙(如果有一些事件靠近在一起,其间包含一个0)。 / p>

如果事件中没有间隙,则此方法有效,但是如果存在间隙,则代码仅打印超出零值的事件结束,而不是前面的值。

e.g。 如果事件是:

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

1 个答案:

答案 0 :(得分: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. 

希望有所帮助。