Seite 1 von 1

Finde Zeitspanne und berechne Mittelwert

Verfasst: Fr Jun 12, 2020 12:55 pm
von jessi
Hallo liebe Forum-Profis,

ich habe einen Temperaturdatensatz von 1970 bis 2000 und möchte daraus bestimmen, wie oft an fünf aufeinanderfolgenden Tagen die Temperatur kleiner 0 war. Dieses "Problem" konnte ich mit dem Befehl rle lösen.

Code: Alles auswählen

## erstelle Beispieldatensatz
df_temp <- data.frame(
    date = seq(as.Date("1970-01-01"), length = 1500, by = "days"),
    temp = rnorm(1500)

runs <- rle(df_temp$temp < 0)

p5 <- df_temp[(cumsum(runs$lengths) - runs$lengths + 1)[runs$values & runs$lengths >= 5], ]

##
head(p5,5)
##            Datum Tmittel    
## 4029  1972-01-12    -0.5   
## 4363  1972-12-11    -0.2 
## 4373  1972-12-21    -0.6 
## 4389  1973-01-06    -0.5   
## 4396 1973-01-13    -0.4  
## 4438  1973-02-24    -0.3 

Gefunden wird der erste Tag der T<0-Periode. Jetzt möchte ich gerne die mittlere Temperatur in der jeweiligen Periode bestimmen und wenn geht, auch, wieviele Tage es tatsächlich unter Null sind.

Wäre toll, wenn mir jemand bei dem Problem einen Tipp geben könnte :)

Danke
sonnige Grüße
Jessi

Re: Finde Zeitspanne und berechne Mittelwert

Verfasst: Fr Jun 12, 2020 1:14 pm
von jogo
Hallo Jessi,

Code: Alles auswählen

## erstelle Beispieldatensatz
set.seed(42)
df_temp <- data.frame(
  date = seq(as.Date("1970-01-01"), length = 1500, by = "days"),
  temp = rnorm(1500))
  
runs <- rle(df_temp$temp < 0)
Runs <- data.frame(l=runs$lengths, v=runs$values)
Runs$Beginn <- with(Runs, cumsum(l) - l + 1)
Runs$Rid <- 1:nrow(Runs)
df_temp$Rid <- rep(Runs$Rid, Runs$l)
aggregate(temp ~ Rid, data=df_temp, FUN=mean)[Runs$v,]  ### oder:
aggregate(temp ~ Rid, data=df_temp, FUN=mean, subset=rep(Runs$v, Runs$l))

nrow(aggregate(temp ~ Rid, data=df_temp, FUN=mean)[Runs$v,])
sum(Runs$v)
Die Anzahl der Tage, die zu der jeweiligen Periode gehört, steht schon in runs$lengths.

Code: Alles auswählen

runs$lengths[runs$value]
Im Paket data.table gibt es die Funktion rleidv(), die ich händisch nachgestellt habe mit folgendem Code:

Code: Alles auswählen

Runs$Rid <- 1:nrow(Runs)
df_temp$Rid <- rep(Runs$Rid, Runs$l)
Gruß, Jörg

Re: Finde Zeitspanne und berechne Mittelwert

Verfasst: Sa Jun 13, 2020 3:40 pm
von jessi
Lieber Jörg,

vielen Dank für die schnelle Hilfe und das Aufspalten des Codes :)

Grüße
Jessi

Re: Finde Zeitspanne und berechne Mittelwert

Verfasst: Mo Jun 15, 2020 9:26 am
von jogo
Hallo Jessi,

mit rle() warst Du ja schon auf dem richtigen Weg. Hier noch eine eingekürzte Variante:

Code: Alles auswählen

runs <- rle(df_temp$temp < 0)
df_temp$Rid <- with(runs, rep(seq_along(lengths), lengths))
aggregate(temp ~ Rid, data=df_temp, FUN=mean)[runs$values,]  ### oder:
aggregate(temp ~ Rid, data=df_temp, FUN=mean, subset=rep(runs$values, runs$lengths))
Gruß, Jörg