Finde Zeitspanne und berechne Mittelwert

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Finde Zeitspanne und berechne Mittelwert

Beitrag 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
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Finde Zeitspanne und berechne Mittelwert

Beitrag 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
jessi
Beiträge: 100
Registriert: Mo Jul 10, 2017 9:23 am

Re: Finde Zeitspanne und berechne Mittelwert

Beitrag von jessi »

Lieber Jörg,

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

Grüße
Jessi
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Finde Zeitspanne und berechne Mittelwert

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