Seite 1 von 1

Datenauswahl anhand einer Datumsperiode mit anschließender Berechnung von Werten

Verfasst: Di Sep 03, 2019 3:01 pm
von Strix
Liebe R-Forum User und Userinnen,

vor etwas mehr als drei Jahren hab ich hier schon einmal wunderbar Hilfe erhalten und jetzt bräuchte ich euch wieder. Ich stehe mit einem Datensatz etwas auf der Leitung. Es geht um Brutdaten einer Vogelart und den Einfluss, den z.B. Niederschlag auf diese Bruten hat.
Dafür möchte ich unter anderem den Mittelwert des Niederschlags bzw. Minima und Maxima in der jeweiligen Brutperiode ansehen. Bei der Berechnung dieser Werte stehe ich gerade an.

Brutbeginn, Brutende und die Wetterstation in der Nähe der jeweiligen Brut stehen in einem Datensatz ("brut"), Niederschlagswerte pro Tag und Wetterstation stehen in einem anderen ("wetter").

Code: Alles auswählen

wetter <- data.frame(
  'Station'=c(0,0,0,0,0,1,1,1,1,1), # unterschiedliche Wetterstationen
  'Julian_Day'=c(1,2,3,4,5,1,2,3,4,5), # Datum angegeben als Julianisches Datum
  'Niederschlag'=c(10,80,20,50,10, 20,30,10,20,40) # Niederschlag an den jeweiligen Wetterstationen zum jeweiligen Datum
  )
wetter

brut <- data.frame(
  'Anfang'=c(1,2,1,3), # Beginndatum der Brut angegeben als julianisches Datum
  'Ende'=c(3,4,5,5), # Enddatum der Brut angegeben als julianisches Datum
  'Station'=c(0,1,1,0) # Wetterstation in der Nähe der Brut
  )
brut
Nun möchte ich gerne für jede Brut (ausgehend von ihrem Anfang und Enddatum) den mittleren Niederschlag in Abhängigkeit von der Station an der die Brut stattfand berechnen.

Ein Kollege meinte ich soll es mit folgendem versuchen:

Code: Alles auswählen

Wetter_Brut = wetter

Wetter_Brut = wetter
Wetter_Brut = Wetter_Brut[Wetter_Brut$Anfang>=brut$Anfang[i],]
Wetter_Brut = Wetter_Brut[Wetter_Brut$Anfang<=brut$Ende[i],]
Wetter_Brut = Wetter_Brut[Wetter_Brut$Station==brut$Station[i],]

brut[i,3]=mean(Wetter_Brut$Niederschlag)
Das bringt mir allerdings nur folgende Fehlermeldung ein:

Code: Alles auswählen

Error in brut$Anfang[i] : invalid subscript type 'list'
Selbst hätte ich gerne etwas in Richtung "wähle jeweils den Niederschlag von Anfangs- bis Enddatum in Abhängigkeit von der Wetterstation, berechne den Mittelwert (oder gib das Minimum an) über diese Periode und schreibe es neben die jeweilige Brut in eine neue Spalte"

Ich bin etwas ratlos, obwohl ich mir sicher bin, dass es kein sonderlich kompliziertes Problem ist... vielleicht überwiegt gerade der Knopf im Kopf.

Für eure Hilfe wäre ich wieder einmal sehr dankbar!

Liebe Grüße,
Strix

Re: Datenauswahl anhand einer Datumsperiode mit anschließender Berechnung von Werten

Verfasst: Di Sep 03, 2019 3:19 pm
von jogo
Hallo Strix,

bei mir sieht das so aus:

Code: Alles auswählen

Nieder <- function(Bi)
  sum(subset(wetter, Station==Bi$Station & Bi$Anfang <= Julian_Day & Julian_Day<=Bi$Ende)$Niederschlag)

brut$Niederschlag <- sapply(1:nrow(brut), function(i) Nieder(brut[i,]))
brut
Hier ist auch noch eine Lösung mit mapply():

Code: Alles auswählen

Nieder2 <- function(Stat, Anf, End)
  sum(subset(wetter, Station==Stat & Anf <= Julian_Day & Julian_Day<=End)$Niederschlag)

mapply(Nieder2, brut$Station, brut$Anfang, brut$Ende)
Gruß, Jörg

Re: Datenauswahl anhand einer Datumsperiode mit anschließender Berechnung von Werten

Verfasst: Mi Sep 04, 2019 9:05 am
von Strix
Hallo Jörg,

vielen herzlichen Dank! Das ist so simpel wie genial :) die Möglichkeit mir dafür selbst eine Funktion zu schreiben, fiel mir nicht ein...
Es ist echt schön, wie schnell ihr hier Lösungen aufzeigt!
Wer weiß, nachdem die Auswertung sicher noch ein paar Überraschungen bereit hält, melde ich mich vielleicht bald wieder.

Liebe Grüße,
Strix

Re: Datenauswahl anhand einer Datumsperiode mit anschließender Berechnung von Werten

Verfasst: Mi Sep 04, 2019 9:40 am
von jogo
Hallo Strix,
Strix hat geschrieben: Mi Sep 04, 2019 9:05 am die Möglichkeit, mir dafür selbst eine Funktion zu schreiben, fiel mir nicht ein...
ohne das Schreiben eigener Funktionen wäre der Nutzen der apply-Funktionen (und auch z.B. aggregate()) sehr eingeschränkt

Gruß, Jörg