Seite 1 von 1

Berechnung von Fenstern bestimmter Breite

Verfasst: Mo Mai 14, 2018 11:31 pm
von Marge
Guten Abend zusammen!

Im Rahmen einer Hausarbeit habe ich einige Datensätze (Matrizen) mit teilweise tausenden Zeilen, die ich nun auswerten möchte. Ich stehe dabei vor dem Problem, dass ich z.B. den Mittelwert nicht über alle Werte, sondern über Windows mit bestimmter, gleichmäßiger Breite bilden möchte. Ich habe schon gesucht und bin auf Funktionen/Objekte wie Cluster Analysis, Time Windows und Time-series gestoßen, allerdings habe ich es damit nicht richtig hinbekommen.
Nun meine Frage: Gibt es eine Funktion oder ähnliches, bei der ich
1. meinen Dataframe einlesen
2. die Anzahl der Werte auf die eine Funktion (z.B. Mittelwert) angewandt werden soll angeben und
3. die anzuwendende Funktion (z.B. Mittelwert) bestimmen kann?

Ich freue mich über jeden Hinweis :)
Viele Grüße
Marge

Re: Berechnung von Fenstern bestimmter Breite

Verfasst: Di Mai 15, 2018 12:24 am
von EDi
rollapply aus dem zoo Paket macht das unter anderem . Ohne ein reproduzierbares Beispiel kann ich aber nicht mehr in Details gehen.

Re: Berechnung von Fenstern bestimmter Breite

Verfasst: Mi Mai 16, 2018 4:22 pm
von Marge
Hallo EDi,

danke für deine Antwort!
Hier folgt nun das Minimalbeispiel:

Code: Alles auswählen

zeit <- c(12, 13, 14, 15, 16, 17, 18)
accx <- c(-0.262, -0.385, -0.415, -0.323, -0.292, -0.323, -0.385)
accy <- c(-0.875, -0.906, -0.875, -0.875, -0.875, -0.906, -0.906)
accz <- c(0.206,  0.333,  0.365,  0.270,  0.238,  0.238,  0.302)
test <- data.frame(zeit, accx, accy, accz)
test
rollapply(test$accz, 3, mean, fill=NA)
In der Matrix sind vier Spalten: die erste beinhaltet die Zeit in Sekunden, die anderen drei behinhalten Beschleunigungen in x-, y- und z-Richtung.

Nach deinem Hinweis zu der Funktion rollapply habe ich mir die Beschreibung durchgelesen und ausprobiert, stoße allerdings weiterhin auf ein Problem.
rollapply berechnet für die ersten drei Werte (entsprechend der Zeit 12 bis 14) von accz den richtigen Mittelwert. Aber statt dass anschließend der Mittelwert der darauf folgenden drei accz-Werte (entsprechend der Zeit 15 bis 17) berechnet wird, kommt ein Ergebnis raus, das ich nicht nachvollziehen kann. Zudem möchte ich die Anzahl der ausgegebenen Ergebnisse durch das Zusammenfassen von jeweils drei Werten verringern, das passiert allerdings auch nicht.

Ich hoffe, das Beispiel hilft, um meine Frage besser nachvollziehen zu können.
Viele Grüße
Marge

Re: Berechnung von Fenstern bestimmter Breite

Verfasst: Mi Mai 16, 2018 9:01 pm
von EDi
Hilft dir das weiter? Das by= argument macht das. Anbei noch weitere Beispiele...

Code: Alles auswählen

zeit <- c(12, 13, 14, 15, 16, 17, 18)
accx <- c(-0.262, -0.385, -0.415, -0.323, -0.292, -0.323, -0.385)
accy <- c(-0.875, -0.906, -0.875, -0.875, -0.875, -0.906, -0.906)
accz <- c(0.206,  0.333,  0.365,  0.270,  0.238,  0.238,  0.302)
test <- data.frame(zeit, accx, accy, accz)

library(zoo)
rollapply(test$accz, width = 3, FUN=mean, by = 3)

# all at once
rollapply(test, width = 3, FUN=mean, by = 3)

# all at once, for all (last has only 1 obs)
rollapply(test, width = 3, FUN=mean, by = 3, partial =TRUE, align = 'left')

# same, without rollapply
test$idx <- rep(seq_len(ceiling(nrow(test) / 3)), each = 3)[1:nrow(test)]
tapply(test$accz, test$idx, mean)

Re: Berechnung von Fenstern bestimmter Breite

Verfasst: Do Mai 17, 2018 10:44 am
von Marge
Vielen Dank, das ist genau, was ich gesucht habe! :)

Zum Verständnis habe ich aber noch eine Frage:
Was bewirkt

Code: Alles auswählen

align = 'left'
im dritten Beispiel?

Viele Grüße
Marge

Re: Berechnung von Fenstern bestimmter Breite

Verfasst: Do Mai 17, 2018 8:21 pm
von EDi
siehe

Code: Alles auswählen

?rollapply