Seite 1 von 1
Monate chronologisch ordnen
Verfasst: Fr Apr 24, 2020 12:13 pm
von jessi
Hallo liebes Forum-Team,
ich habe Tagesmitteltemperaturen und möchte diese in Monatsmittelwerten zusammenfassen - soweit so gut. Das hat auch funktioniert, gemacht habe ich es folgenderweise:
Code: Alles auswählen
tm <- read.csv(tmittel_tag.csv", sep = ";", dec = ",", header = TRUE)
### str(tm)
###### 'data.frame': 5475 obs. of 2 variables:
###### $ Datum : Factor w/ 21549 levels "1999-01-01",..: 1 2 3 4 5 6 7 8 9 10 ...
###### $ Tmittel : num -1.6 -1.8 -1.9 -1.5 -0.4 -2.2 -2.9 -0.3 2.5 1 ...
### factor Datum in date umwandeln
tm$Datum <- as.Date(tm$Datum)
### spalte Datum in Jahr, Monat und Tag auf
tm$Monat <- months(tm$Datum)
tm$Jahr <- format(tm$Datum, format = "%Y")
tm$Tag <- format(tm$Datum, format = "%d")
### Berechne Monatsmittelwerte nach Monat und Jahr
T_mm <- aggregate(tm$Tmittel ~ tm$Monat + tm$Jahr, tm, FUN = mean)
Nur werden jetzt die Monate Alphabetisch geordnet, da ich allerdings den zeitlichen Verlauf plotten möchte, benötige ich T_mm chronologisch geordnet nach
Jänner 2011 0.09032258
Februar 2011 1.98
März 2011 3.23
...
Jänner 2018 1.01
Februar 2018 2.42
...
Kann mir hier jemand weiterhelfen, wie ich das am besten lösen?
Danke und sonnige Grüße
Jessi
Re: Monate chronologisch ordnen
Verfasst: Fr Apr 24, 2020 12:26 pm
von jogo
Hallo Jessi,
wo kommen denn die Monatsnamen her? Werden die von der Funktion months() produziert?
Ich empfehle, gleich in den Dataframe
tm eine Spalte für die Nummer des Monats aufzunehmen (oder eventuell gleich kombiniert mit dem Jahr).
Beim aggregate kannst Du es noch bequemer haben:
Code: Alles auswählen
T_mm <- aggregate(Tmittel ~ Monat + Jahr, data=tm, FUN = mean)
in der neuen Variante:
Code: Alles auswählen
T_mm <- aggregate(Tmittel ~ xMonat, data=tm, FUN = mean)
Gruß, Jörg
Re: Monate chronologisch ordnen
Verfasst: Fr Apr 24, 2020 12:56 pm
von jessi
Hallo Jörg,
danke für deine schnelle Antwort.
wo kommen denn die Monatsnamen her? Werden die von der Funktion months() produziert?
Die Monatsnamen hat die Funktion months() erstellt, da kam nichts von mir.
Ich werde das gleich noch umbauen, danke
Jetzt hat sich gleich auch noch ein anderes Problem aufgetan. Zusätzlich zu den Jahresmittelwerten möchte ich auch die Mittelwerte der Saisonen bestimmen. Allerdings überschreitet die Wintersaison das Jahr. Gibt es einen Befehl in R, dass die z.B. Monate Dezember 1998, Jänner 1999 und Februar 1999 gemittelt werden, also der Dezember aus dem Vorjahr? Mit dem jetzigen Befehl werden über die Jahre gemittelt, also Jänner, Feburar und Dezember aus 1999. Zuvor habe ich mittels des Befehls "subset" den Datensatz nur mit den jeweiligen Monaten (DJF, MAM, ...) zusammengefasst.
Danke nochmals.
Grüße
Jessi
Re: Monate chronologisch ordnen
Verfasst: Fr Apr 24, 2020 1:19 pm
von jogo
Hallo Jessi,
wenn es um arithmetische Mittel für die Saisonen geht, so kannst Du die aus den Monatsmittelwerten berechnen.
Die korrekte Gruppierungsvariable musst Du Dir passend erstellen und in die Tabelle packen.
Code: Alles auswählen
paste0(rep(1998:2001, each=4), c(".1F", ".2S", ".3H", ".4W"))
Gruß, Jörg
Re: Monate chronologisch ordnen
Verfasst: So Apr 26, 2020 1:11 pm
von jessi
Hallo Jörg,
danke für deine Antwort.
Ja es geht um das arithmetische Mittel der Saison.
Leider verstehe ich deine Antwort nicht so ganz. Wie kann ich mir die Saison Winter erstellen? Und wie kann ich R sagen, dass das Monat Dezember aus dem Jahr davor herangezogen werden soll.
Irgendwie stehe ich da gerade etwas auf der Leitung?
Danke für weitere Tipps.
Grüße
Jessi
Re: Monate chronologisch ordnen
Verfasst: So Apr 26, 2020 1:23 pm
von jogo
Hallo Jessi,
wenn Du mir ein reproduzierbares Beispiel lieferst, kann ich es Dir vorführen.
viewtopic.php?f=20&t=11
oder auch
https://stackoverflow.com/questions/596 ... le-example
Gruß, Jörg
Re: Monate chronologisch ordnen
Verfasst: So Apr 26, 2020 3:36 pm
von jessi
Hallo Jörg,
ich habe unten einen Datensatz erzeugt, danach Jahr und Monat aufgespalten und die drei benötigten Monaten erzeugt.
Für Dezember, Jänner und Februar habe ich dann jeweils den Mittelwert berechneten und anschließend habe ich die Wintersaison definiert mit zB. Dezember-Mittel 1999, Jänner-Mittel 2000, Februar-Mittel 2000. Mit der for-Schleife über den gesamten Zeitraum. Jetzt weiß ich allerdings nicht mehr weiter ...
Ev. kannst du nochmals aushelfen
Code: Alles auswählen
df <- data.frame(date = seq(from = as.Date("1991-01-01"),
to = as.Date("2009-12-31"),
by = "day"))
df$vals <- rnorm(nrow(df))
df$year <- format(df$date, "%Y")
df$month <- format(df$date, "%m")
df$month <- as.integer(df$month)
jan <- subset(df, df$month==1)
feb <- subset(df, df$month==2)
dez <- subset(df, df$month==12)
##Bilde Monatsmittelwerte
dez_mean <- aggregate(dez$vals ~ year, dez, FUN = mean)
jan_mean <- aggregate(jan$vals ~ year, jan, FUN = mean)
feb_mean <- aggregate(feb$vals ~ year, feb, FUN = mean)
colnames(dez_mean) <- c("year", "mittel")
colnames(jan_mean) <- c("year", "mittel")
colnames(feb_mean) <- c("year", "mittel")
## Wintersaison definiert
winter <- data.frame(dez_mean[1,], jan_mean[2,],feb_mean[2,])
mittel_winter <- mean(winter$mittel)
winter <- data.frame(name = character(0), len=numeric(0))
for (i in 1:length(feb_mean$year)){
winter <- rbind(winter, data.frame(dez_mean[i,], jan_mean[i+1,],feb_mean[i+1,])) }
colnames(winter) <- c("year_d", "dez_mittel", "year_j", "jan_mittel", "year_f", "feb_mittel")
Danke!
Grüße Jessi
Re: Monate chronologisch ordnen
Verfasst: So Apr 26, 2020 5:20 pm
von Athomas
So schwer ist es doch nicht: Du musst nur gucken, dass der Dezember des Jahres 1999 mit dem Januar und Februar des Folgejahres in einer Gruppe landet - mit einem einheitlichen Gruppennamen.
Der könnte z.B. "Winter 1999/2000" lauten.
Du könntest für die Dezembermonate etwa
und für Januare und Februare
berechnen, und - voila - haben diese Monate den passenden Saisonnamen!
Re: Monate chronologisch ordnen
Verfasst: Mo Apr 27, 2020 8:30 am
von jogo
Hallo Jessi,
so etwa:
Code: Alles auswählen
df <- data.frame(date = seq(from = as.Date("1991-01-01"), to = as.Date("2009-12-31"), by = "day"))
set.seed(42)
df$vals <- rnorm(nrow(df))
df$year <- format(df$date, "%Y")
df$month <- format(df$date, "%m")
df$monthi <- as.integer(df$month)
df$ym <- sprintf("%s.%02d", df$year, df$monthi)
### wenn Du wirklich sowas machen willst, dann M <- split(df, df$month)
### ... aber in diesem Fall solltest Du das nicht wollen, sondern die Daten beisammen halten.
# jan <- subset(df, df$month==1)
# feb <- subset(df, df$month==2)
# dez <- subset(df, df$month==12)
##Bilde Monatsmittelwerte
dfmean <- aggregate(vals ~ ym, data=df, FUN=mean)
dfmean <- within(dfmean, { monthi <- as.integer(substr(ym, 6, 7)); year <- as.integer(substr(ym, 1, 4)) })
# dez_mean <- aggregate(dez$vals ~ year, dez, FUN = mean)
# jan_mean <- aggregate(jan$vals ~ year, jan, FUN = mean)
# feb_mean <- aggregate(feb$vals ~ year, feb, FUN = mean)
S <- rep(c("1.Winter", "2.Frühling", "3.Sommer", "4.Herbst", "1.Winter"), c(2, 3, 3, 3, 1))
dfmean$saison <- S[dfmean$monthi]
dfmean$syear <- ifelse(dfmean$monthi==12, dfmean$year + 1, dfmean$year)
dfmean$ysaison <- sprintf("%d.%s", dfmean$syear, dfmean$saison)
dfmean[1:20,]
aggregate(vals ~ ysaison, data=dfmean, FUN=mean)
Gruß, Jörg