2016-07-09 8 views
0

Ich habe stündliche Niederschlagsdaten, die ich nach Jahren in Matrizen aufgeteilt habe. Die Matrizen befinden sich in einer Liste mit der Bezeichnung tenyr.matrix.list. Ich möchte die Niederschlagsdaten in Ereignisse aufteilen, basierend auf einer Inter-Event-Periode von 6 Stunden.Zeitreihendaten in Ereignisse in R aufteilen (Wiederholung/Schleife)

Der folgende Code ist mein Versuch. Ich habe eine Maske verwendet, um den nächsten 0-Wert oder nächsten Wert zu identifizieren, der nicht Null ist, um das Ende und den Beginn von Ereignissen zu definieren. Dann habe ich eine Wiederholungsschleife verwendet, um diesen Prozess zu wiederholen, bis eine 6-Stunden-Lücke zwischen dem Ende des Ereignisses und dem Beginn des nächsten Ereignisses besteht (falls Ereignisse nahe beieinander liegen, die eine 0 dazwischen enthalten).

Dies funktioniert, wenn keine Lücken innerhalb der Ereignisse vorhanden sind. Wenn jedoch Lücken vorhanden sind, gibt der Code nur das Ende des Ereignisses über den Nullwert hinaus aus und nicht die vorherigen Werte.

z.B. Wenn das Ereignis:

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. 

Das ist, was der Code druckt.

jedoch, wenn die Veranstaltung ist:

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. 

Die Code druckt nur der zweite Teil über die Null: 2006/12/12 09.00 7, 2006/12/12 10.00 3, 2006/12/12 11.00 1.

Kann mir jemand erklären, was mir fehlt?

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

Geben Sie kleine repräsentative Daten Beispiel bitte auch bitte machen Sie Ihren Text kurz! iss time du kannst ein Beispiel geben, so dass eine Person, die dein Problem nicht kennt, deiner Frage folgt – Learner

+3

Bitte lies [wie man minimal reproduzierbare Beispiele in R liefert] (http://stackoverflow.com/questions/5963269/how-to- make-a-great-r-reproduzierbares Beispiel # answer-5963610). Dann bearbeiten und verbessern Sie es entsprechend. Ein guter Post liefert normalerweise * minimale * Eingabedaten, die gewünschten Ausgabedaten und einige Code-Versuche - alles * copy-paste-run'able *. Es verwendet auch richtige SO-Formatierungen. Das Plakat sollte keinen Ballast abwerfen. Zusammenfassung von Ihrem Problem, wenn möglich, minimieren Sie Ihre Ex. Datensatz und Code unter Beibehaltung der vollständigen Reproduzierbarkeit, konzentrieren Sie sich auf ein Problem zu einem Zeitpunkt und stellen Sie sicher, es gibt eine Frage, die auffällt. – lukeA

Antwort

0

Ich habe einen viel einfacheren Ansatz verwendet, um Niederschlagsdaten in Ereignisse auf einem Minimum Inter-Event Time (MIT) von 30 Minuten auf Basis zu brechen. Hier ist mein Code:

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

Hoffe, dass hilft.