我有每小时的降雨数据,我按年分成矩阵。矩阵位于名为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
答案 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.
希望有所帮助。