R - Szybszy sposób obliczania statystyk kroczących w przedziale zmiennym

Jestem ciekaw, czy ktoś może wymyślić (szybszy) sposób obliczania statystyk toczenia (średnia krocząca, mediana, percentyle itp.) W zmiennym przedziale czasu (okienkowanie).

To znaczy, załóżmy, że podano losowo obserwacje czasowe (tzn. Nie dane dzienne lub tygodniowe, obserwacje mają tylko znacznik czasu, jak w danych kleszczy), i przypuśćmy, że chcesz spojrzeć na statystyki centrum i dyspersji, które możesz poszerzyć i zaostrzyć przedział czasu, w którym te statystyki są obliczane.

Zrobiłem prostą pętlę for, która to robi. Ale oczywiście działa bardzo wolno (w rzeczywistości myślę, że moja pętla nadal działa na małej próbce danych, które ustawiłem, aby przetestować jej prędkość). Starałem się uzyskać coś takiego, jak to zrobić - co wydaje mi się łatwiejsze, aby uruchomić codzienne statystyki - ale wydaje mi się, że nie mogę wyjść z tego.

Przykład:

Przykładowa konfiguracja:

df <- data.frame(Date = runif(1000,0,30))
df$Price <- I((df$Date)^0.5 * (rnorm(1000,30,4)))
df$Date <- as.Date(df$Date, origin = "1970-01-01")

Przykładowa funkcja (działa bardzo wolno z wieloma obserwacjami

SummaryStats <- function(dataframe, interval){
  # Returns daily simple summary stats, 
  # at varying intervals
  # dataframe is the data frame in question, with Date and Price obs
  # interval is the width of time to be treated as a day

  firstDay <- min(dataframe$Date)
  lastDay  <- max(dataframe$Date)
  result <- data.frame(Date = NULL,
                       Average = NULL,  Median = NULL,
                       Count = NULL,
                       Percentile25 = NULL, Percentile75 = NULL)

  for (Day in firstDay:lastDay){

    dataframe.sub = subset(dataframe,
                Date > (Day - (interval/2))
                & Date < (Day + (interval/2)))

    nu = data.frame(Date = Day, 
                    Average = mean(dataframe.sub$Price),
                    Median = median(dataframe.sub$Price),
                    Count = length(dataframe.sub$Price),
                    P25 = quantile(dataframe.sub$Price, 0.25),
                    P75 = quantile(dataframe.sub$Price, 0.75))

    result = rbind(result,nu)

  }

  return(result)

}

Twoja rada byłaby mile widziana!

questionAnswers(4)

yourAnswerToTheQuestion