Otros consejos

O simplemente puede calcularla usando el filtro, aquí está la función que utilizo:

ma <- function(x, n = 5){filter(x, rep(1 / n, n), sides = 2)}

Si utiliza dplyr, tenga cuidado para especificar stats::filter en la función anterior.

El uso de cumsum debe ser suficiente y eficiente. Asumiendo que tiene un vector x y desea una suma continua de n Números

cx <- c(0,cumsum(x))
rsum <- (cx[(n+1):length(cx)] - cx[1:(length(cx) - n)]) / n

Como se señala en los comentarios de @mzuther, esto supone que no hay AN en los datos. para hacer frente a los requeriría dividiendo cada ventana por el número de valores no-NA. He aquí una manera de hacer eso, incorporando el comentario de @Ricardo Cruz:

cx <- c(0, cumsum(ifelse(is.na(x), 0, x)))
cn <- c(0, cumsum(ifelse(is.na(x), 0, 1)))
rx <- cx[(n+1):length(cx)] - cx[1:(length(cx) - n)]
rn <- cn[(n+1):length(cx)] - cn[1:(length(cx) - n)]
rsum <- rx / rn

Esto todavía tiene el problema de que si todos los valores en la ventana son AN entonces habrá una división por cero error.

data.table 1.12.0 nueva función frollmean se ha añadido para calcular rápida y exacta de rodadura significa cuidadosamente el manejo NA, NaN y +Inf, los valores -Inf.

Como no hay ningún ejemplo reproducible en la pregunta no hay mucho más para abordar aquí.

Puede encontrar más información sobre ?frollmean en el manual, también disponible en línea en ?frollmean .

Ejemplos de instrucciones a continuación:

library(data.table)
d = as.data.table(list(1:6/2, 3:8/4))

# rollmean of single vector and single window
frollmean(d[, V1], 3)

# multiple columns at once
frollmean(d, 3)

# multiple windows at once
frollmean(d[, .(V1)], c(3, 4))

# multiple columns and multiple windows at once
frollmean(d, c(3, 4))

## three above are embarrassingly parallel using openmp

El paquete caTools ha rodando muy rápido media / min / max / SD y algunas otras funciones. Sólo he trabajado con runmean y runsd y ellos son los más rápidos de cualquiera de los otros paquetes mencionados hasta la fecha.

Se puede usar RcppRoll de medias móviles muy rápidas escritas en C ++. Sólo tiene que llamar a la función roll_mean. Docs se pueden encontrar aquí .

De lo contrario, esto (más lenta) para el bucle debe hacer el truco:

ma <- function(arr, n=15){
  res = arr
  for(i in n:length(arr)){
    res[i] = mean(arr[(i-n):i])
  }
  res
}

De hecho RcppRoll es muy bueno.

El código publicado por cantdutchthis debe ser corregido en la cuarta línea de la ventana se fijará:

ma <- function(arr, n=15){
  res = arr
  for(i in n:length(arr)){
    res[i] = mean(arr[(i-n+1):i])
  }
  res
}

Otra forma, que se ocupa de missings, se da aquí .

Una tercera forma, mejorar cantdutchthis código para calcular promedios parciales o no, sigue:

  ma <- function(x, n=2,parcial=TRUE){
  res = x #set the first values

  if (parcial==TRUE){
    for(i in 1:length(x)){
      t<-max(i-n+1,1)
      res[i] = mean(x[t:i])
    }
    res

  }else{
    for(i in 1:length(x)){
      t<-max(i-n+1,1)
      res[i] = mean(x[t:i])
    }
    res[-c(seq(1,n-1,1))] #remove the n-1 first,i.e., res[c(-3,-4,...)]
  }
}

Con el fin de complementar la respuesta de cantdutchthis y Rodrigo Remedio ;

moving_fun <- function(x, w, FUN, ...) {
  # x: a double vector
  # w: the length of the window, i.e., the section of the vector selected to apply FUN
  # FUN: a function that takes a vector and return a summarize value, e.g., mean, sum, etc.
  # Given a double type vector apply a FUN over a moving window from left to the right, 
  #    when a window boundary is not a legal section, i.e. lower_bound and i (upper bound) 
  #    are not contained in the length of the vector, return a NA_real_
  if (w < 1) {
    stop("The length of the window 'w' must be greater than 0")
  }
  output <- x
  for (i in 1:length(x)) {
     # plus 1 because the index is inclusive with the upper_bound 'i'
    lower_bound <- i - w + 1
    if (lower_bound < 1) {
      output[i] <- NA_real_
    } else {
      output[i] <- FUN(x[lower_bound:i, ...])
    }
  }
  output
}

# example
v <- seq(1:10)

# compute a MA(2)
moving_fun(v, 2, mean)

# compute moving sum of two periods
moving_fun(v, 2, sum)

Aunque un poco lento, pero también se puede utilizar zoológico :: rollapply para realizar cálculos sobre matrices.

reqd_ma <- rollapply(x, FUN = mean, width = n)

donde x es el conjunto de datos, FUN = media es la función; también puede cambiar a mínimo, máximo, SD, etc y la anchura es la ventana de rodadura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top