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