For Loop für jede id

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

Moderatoren: EDi, jogo

Antworten
Bolli

For Loop für jede id

Beitrag von Bolli »

Liebes Forum, ich habe als r-Neuling die Aufgabe eine Excel-Berechnung in R zu Programmieren. Bisher berechnet diese eine Art Schleife für Klimadaten aus einem Zeitraum von November bis Juni des Folgejahres. Ich möchte dies für 91 solcher Zeiträume, also fast ein Jahrhundert, mit einem Enterdrücken berechnen. Bisher bin ich soweit, dass ich aus einen Dataframe 8 Variablen ausgewählt habe. Tag, Monat, Jahr, Datum, Kalendertag(doy), mittlere Tagestemperatur(tmit), ts(time series), CD(chill days). Die Spalte ts bezeichnet die Jahreszahl der mehrheitlichen Monate des einzelnen Aufnahmezeitraumes und soll mir als Klassifizierung dienen. Beim Datum 17.11.2015 steht also in der Spalte ts das Jahr 2016. Genauso für das Datum 21.02.2016. Auf diese Art wollte ich eine id bilden um eine for-Schleife für jeden Zeitraum durchlaufen zu lassen. Nun soll für jeden Tag innerhalb des Zeitraumes in der neuen Spalte CD ein Kältetag addiert werden, wenn die mittlere Temperatur <= 9°C ist. Die Schleife soll automatisch enden, wenn der Zeitraum ts endet (je nachdem ob Schaltjahr oder nicht also 91*242 bzw. 243 Zeilen). Ich verspreche mir also 91 verschiedene Kältesummen, deren Zwischenergebnisse in der Spalte CD mitgeführt werden. Später folgen in der Berechnung Summen von Wärmetagen und Einbeziehung weiterer Konstanten. Fürs erste würde mir dieser Schritt aber schon sehr helfen. Meine Schleife macht nämlich leider unabhängig der Zeiträume einfach die Berechnung 91x. Ich nehme an, dass ich $ts vielleicht falsch formatiert habe, komme hier aber nicht weiter. Ein Problem am Rande ist, dass ich den jeweils ersten Tag nicht einbeziehe, weil die Addition ja auf den Vortag aufbaut und da noch kein Wert ist. Vielleicht eine weitere Schleife einbauen mit ifelse (i!=1, 0, 1) oder geht das auch eleganter?

Code: Alles auswählen

  df <-subset(df, mo <7 | mo > 10)
    df<- df[,c(1:5,7)]
    df$ts<-ifelse(df$mo <10, df$jahr, df$jahr+1)
    ll <-levels(as.factor(df[,"ts"]))
    df$CD=0
    for (i in 2:length(ll)) {
              if(df$tmit[i]<=9){
              df$CD[i]= df$CD[i-1]+1
          }else {
              df$CD[i]=df$CD[i-1]
          }
    }

Ich freue mich über jede Hilfe und hoffe, dass mein erster Post halbwegs verständlich formuliert ist.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: For Loop für jede id

Beitrag von jogo »

Hallo Bolli,

willkommen im Forum!
Nach einem ersten Blick auf die Aufgabe bin ich der Meinung, dass das auch ohne Schleife geht mit folgenden Mitteln:

Code: Alles auswählen

df$CD <- ave(df$tmit<=9, df$ts, FUN=cumsum)
Wenn Dir das zu quick'n'dirty ist, ist hier die saubere Variante:

Code: Alles auswählen

df$CD <- ave(ifelse(df$tmit<=9, 1, 0), df$ts, FUN=cumsum)
Vielleicht kann es am Ende so aussehen:

Code: Alles auswählen

df <- subset(df, mo <7 | mo > 10, select=c(1:5,7))
df$ts <- ifelse(df$mo<10, df$jahr, 1+df$jahr)
df$CD <- ave(ifelse(df$tmit<=9, 1, 0), df$ts, FUN=cumsum)
Gruß, Jörg
Bolli

Re: For Loop für jede id

Beitrag von Bolli »

Hallo Jörg,
es klappt auf Anhieb und ist ja viel eleganter als die Schleife. Tausend Dank.
Ich versuche jetzt meine weiteren Berechnungen mit der gleichen Funktion anzustellen.
Antworten