Ich habe eine einfache data.frame, wo ich einige zusammenfassende Statistiken auf einer rollenden Basis berechnen möchte. Zum Beispiel kann ein Roll Median über ein Fenster von fünf Beobachtungen (2 Lags, aktuelle und 2 voraus) vonbenutze rollaply ohne aktuelle Zeile
library(dplyr)
x <- data.frame("vals" = rnorm(3e04))
y <- x %>%
mutate(med5 = rollapply(data = vals,
width = 5,
FUN = median,
align = "center",
fill = NA,
na.rm = TRUE))
jedoch erreicht wird, würde Ich mag die aktuelle Zeile aus dieser Berechnung auszuschließen. Ich fand den folgenden Ansatz:
z <- x %>%
mutate(N=1:n()) %>%
do(data.frame(., prmed = sapply(.$N, function(i) median(.$vals[.$N %in% c((i - 2):(i - 1), (i + 1):(i + 2))]))))
Das tut, was ich will, wenn ich später die ersten beiden Werte NA
gesetzt.
So weit so gut, das einzige Problem ist, dass der letztere Ansatz schrecklich langsam im Vergleich zu Rollapply ist.
Gibt es einen Weg, um das Ergebnis des letzteren mit der Geschwindigkeit des ersteren zu erreichen?
Funktioniert wie ein Charme, danke! Elegant, unkompliziert und leicht verallgemeinerbar für andere Funktionen als den Median. – Akkariz