2016-04-21 5 views
0

Ich bin neu in R und ich 5 Jahre müssen den Mittelwert der Zeitreihe berechnen, enthält, mit stündlich genommen Daten von ozon etc ..Berechnung der Median einer Zeitreihe, um 8 alle 8 Stunden

Mein df wie folgt aussieht:

structure(list(date = structure(c(1L, 1L, 1L, 1L), .Label = "01.01.2010", class = "factor"), 
day.of = c(1L, 1L, 1L, 1L), time = structure(1:4, .Label = c("00:00", 
"01:00", "02:00", "03:00"), class = "factor"), SVF_Ray = c(1L, 
1L, 1L, 1L), Gmax = c(0, 0, 0, 0), Ta = c(-1.3, -1.2, -1.2, 
-1.2), Tmrt = c(-19.3, -12.1, -12, -12.1), PET = c(-10.4, 
-8.7, -8.7, -8.7), PT = c(-11.3, -9.3, -9.3, -9.3), Ozon = c(61.35, 
62.65, 63.4, 63.85), rDatum = structure(c(14610, 14610, 14610, 
14610), class = "Date"), year = c(2010, 2010, 2010, 2010), 
month = c(1, 1, 1, 1), day = c(1, 1, 1, 1), hour = c(0, 1, 
2, 3)), .Names = c("date", "day.of", "time", "SVF_Ray", "Gmax", 
"Ta", "Tmrt", "PET", "PT", "Ozon", "rDatum", "year", "month", 
"day", "hour"), row.names = c(NA, 4L), class = "data.frame") 

ich alle 8 Stunden, um den Mittelwert von Ozon berechnen möchte, so eine Reihe von 4 berechneten Mitteln für jeden Tag. Ich habe meinen Bezug wie angeordnet:

Datum_Ozon$rDatum <- as.Date(data$date, format="%d.%m.%Y") 

Datum_Ozon$hour<-as.numeric(unlist(strsplit(as.character(df$time), ":"))[seq(1, 2 * length(df$time), 2)]) 

Format ist numerisch

Aber ich weiß nicht weiter, mein Ziel zu erreichen. Danke im Voraus!

+0

Es ist nützlich, um einen (Teil) Ihre Daten mit dput (DF_Ozone) als ein Bild der Daten –

+0

Dank für Ihren Kommentar zu geben, ich herauszufinden versuche, wie es geht. –

+0

Auch ist es schwierig, eine Antwort zu geben, wenn wir nicht wissen, um welche Art von Daten es sich handelt. Unter der Annahme, dass es sich um eine Art von Zeitobjekt handelt, können Sie "ifelse" verwenden, um einige Bedingungen (d. H. Blöcke von 8 Stunden) festzulegen, um eine neue Gruppierungsvariable zu erstellen. – boshek

Antwort

0

Wenn sein der Fall, dass Sie Ihre Daten regelmäßig und vollständig (dh jede Stunde hat einen Rekord), der folgende Basis R Code sollte es tun:

# Get the number of 8 hour intervals 
intervalCnt <- nrow(df)/8L 

# add a grouping vector to your data 
df$group <- rep(1:intervalCnt, each=8) 

# get the median for each interval, keep year var around for later 
intervalMedian <- aggregate(var~group + day + month + year, data=df, FUN=median) 

Beachten Sie, dass diese Lösung auf der Annahme beruht, dass die Daten eine regelmäßige Struktur haben, dh jede Stunde hat eine Aufzeichnung. Wenn das Ausmaß Interesse fehlt, dh NA, dann einfach das Hinzufügen na.rm auf die Aggregatfunktion wird die Statistik von Interesse zurück:

# get the median for each interval 
intervalMedian <- aggregate(var~group + day + month + year, data=df, FUN=median, na.rm=T) 

Wenn Sie eine Variable für Stunde des Tages haben, hier ist ein einfaches Möglichkeit zur Überprüfung der Datenregularität:

table(df$hourOfDay) 

Das Ergebnis dieser Funktion ist eine Häufigkeitszählung für jede Stunde. Die Zählungen sollten gleich sein. Eine andere zu überprüfende Sache ist, dass die erste Beobachtung in der Stunde nach der letzten Beobachtung beginnt, d. H. Wenn die Stunde der Beobachtung 1 == "00:00" ist, dann sollte die Stunde der letzten Beobachtung 23:00 sein.

intervalMeans.year <- aggregate(var~group, data=intervalMedian, 
           FUN=mean, na.rm=T) 

Die Einbeziehung der Gruppe, Tag, Monat und Jahr Variablen in den intervalMedian Daten:

Um eine grafische Darstellung des mittleren der 8 Stunden-Zeiträumen nach Jahren zu bieten, Sie wieder Aggregat verwenden können. Rahmen ermöglichen viele verschiedene Aggregationen. Zum Beispiel mit einer geringfügigen Anpassung ist es möglich, den Mittelwert einer Variablen über den Zeitraum von 5 Jahren für jeden Zeitraum-Tag-Monat zu bekommen:

intervalMedian$periodDay <- rep(1:3, length.out=intervalMedian) 
intervalMeans.dayMonthPeriod <- aggregate(var~periodDay+day+month, 
              data=intervalMedian, FUN=mean, na.rm=T) 
+0

Das Problem mit diesem Ansatz, wie Sie erwähnen, ist, dass Daten oft nicht vollständig sind. Dieser Ansatz würde glücklich weitergehen und Sie könnten nicht wissen, dass Ihr Intervall und falsch zugeordnet werden. – boshek

+0

tatsächlich sind meine Daten leider nicht vollständig, es gibt viele Stunden mit NA –

+0

@boshek das ist eine Frage der Datenstruktur. Manchmal ist es vollständig und manchmal nicht. Wenn die Daten nicht regulär sind, wird diese Option nicht funktionieren. Wenn es regelmäßig ist, ist dies eine sehr einfache Lösung. Es liegt am Analysten, seine Daten zu verstehen, bevor eine Lösung implementiert wird. Wenn, wie das oben genannte OP, die Daten in der Struktur regulär sind, fehlen zwar die event-thread-Werte, dies funktioniert jedoch, solange das Argument na.rm auf TRUE gesetzt ist. – lmo

0

Hier ist ein grundlegendes Beispiel mit einer dplyr Pipe anstelle einer plyr Methode sowie ifelse(). Alles ist selbst hier enthalten:

library(dplyr) 

## OP data 
df <- 
structure(list(date = structure(c(1L, 1L, 1L, 1L), .Label = "01.01.2010", class = "factor"), 
day.of = c(1L, 1L, 1L, 1L), time = structure(1:4, .Label = c("00:00", 
"01:00", "02:00", "03:00"), class = "factor"), SVF_Ray = c(1L, 
1L, 1L, 1L), Gmax = c(0, 0, 0, 0), Ta = c(-1.3, -1.2, -1.2, 
-1.2), Tmrt = c(-19.3, -12.1, -12, -12.1), PET = c(-10.4, 
-8.7, -8.7, -8.7), PT = c(-11.3, -9.3, -9.3, -9.3), Ozon = c(61.35, 
62.65, 63.4, 63.85), rDatum = structure(c(14610, 14610, 14610, 
14610), class = "Date"), year = c(2010, 2010, 2010, 2010), 
month = c(1, 1, 1, 1), day = c(1, 1, 1, 1), hour = c(0, 1, 
2, 3)), .Names = c("date", "day.of", "time", "SVF_Ray", "Gmax", 
"Ta", "Tmrt", "PET", "PT", "Ozon", "rDatum", "year", "month", 
"day", "hour"), row.names = c(NA, 4L), class = "data.frame") 

df %>% 
    mutate(DayChunk=ifelse(hour %in% c(0:7),"FirstThird", 
     ifelse(hour %in% c(8:15), "SecondThird" 
       ,"ThirdThird") 
     )) %>% 
    group_by(Date, DayChunk) %>% 
    summarise(MedOzon=median(Ozon)) 
+0

Ich versuche, Ihre Lösung funktionieren zu lassen, aber leider wird es nicht funktionieren. Was mache ich falsch? Vielen Dank für Ihre Hilfe! –

+0

Funktioniert gut für mich. Sei genau darüber, was nicht funktioniert. Das obige Beispiel läuft gut. – boshek

+1

Ich glaube, Ihr group_by muss das Datum auch zusammen mit DayChunk integrieren, andernfalls ist Ihre Zusammenfassung 3 Elemente lang und nicht 3 pro Tag für die Länge des Datasets. – Dave2e

0

die Funktion seq.POSIXt nachschlagen. Es gibt Optionen zum Festlegen der Start- und Stoppintervalle. Diese Funktion wurde entwickelt, um Zeitreihen zu erstellen. Für Ihr Problem:

myseq<-seq(ISOdate(2010,01,01, 00, 00, 00, tz="GMT"), to=ISOdate(2016,01,05), by = "8 hour") 

Verwenden Sie die ISOdate-Funktionen, um die Start- und Stoppzeiten einzustellen. Wenn Sie viel mit der Zeit arbeiten werden, schlage ich vor, die Funktion strptime und die POSIXlt/ct-Zeitklassen zu untersuchen. Nun mit den definierten Breaks und der Annahme, dass Sie eine Spalte in Ihrem Datenrahmen (Datum_Ozon) namens "datetime" haben, verwenden Sie "cut", um Ihre Daten zu gruppieren/zu unterteilen.

Datum_Ozon$datetime<-as.POSIXct(paste(as.character(Datum_Ozon$date), 
    as.character(Datum_Ozon$time)), "%d.%m.%Y %H:%M", tz="GMT") 

library(dplyr) 
summarize(group_by(Datum_Ozon, cut(Datum_Ozon$datetime, myseq)), mean(Ozon)) 
+0

Wenn ich Ihre Lösung verwende, kehrt der zweite Schritt zurück in: Fehler in 1: intervalCnt: Argument der Länge 0 Vielen Dank für Ihre Unterstützung! –

+0

Ok, habe ein paar Änderungen vorgenommen. Myseq begann um Mittag und nicht um Mitternacht. Alle Zeiten wurden auf GMT eingestellt. Die neu hinzugefügte Datetime-Spalte ist jetzt POSIXct-Klasse. Alles sollte nun konsistent und fehlerfrei sein. Wenn nicht, lass es mich wissen. – Dave2e

+0

@ Dave2e, danke, das hat auch bei mir funktioniert. Jetzt habe ich einen df von 5.477 x2. Der nächste Schritt wäre, ein Grapg mit dem DOY (1 ... 365) zu zeichnen. Jede DOY sollte den Mittelwert jeder DOY (1 ... 365) der Zeitreihe darstellen. Irgendeine Idee? Wie stelle ich GMT auf GMT +1 ein? –

Verwandte Themen