Tengo un vector de valores que me gustaría informar el promedio en ventanas a lo largo de una diapositiva más pequeña.
Por ejemplo, para un vector de los siguientes valores:
4, 5, 7, 3, 9, 8
Un tamaño de ventana de 3 y una diapositiva de 2 harían lo siguiente:
(4+5+7)/3 = 5.33
(7+3+9)/3 = 6.33
(9+8)/3 = 5.67
Y devuelve un vector de estos valores:
5.33, 6.33, 5.67
¿Hay una función simple que haga esto por mí? Si también devuelve los índices de inicio de la ventana, eso sería una ventaja adicional. En este ejemplo eso sería 1,3,5
Respuestas:
La función
rollapply
en el paquete zoo te acerca:Simplemente no calculará el último valor para usted, ya que no contiene 3 observaciones. Tal vez esto será suficiente para su verdadero problema? Además, tenga en cuenta que el objeto devuelto tiene los índices que desea como del
names
vector devuelto.Su ejemplo es suponer que hay un 0 no observado en la última ventana. Puede ser más útil o realista rellenar con un
NA
para representar la información que falta y decirlemean
que maneje los valores que faltan. En este caso tendremos (8 + 9) / 2 como nuestro valor final de ventana.fuente
x<-c(x,0)
) para obtener el último elemento de respuesta.na.rm = TRUE
argumento amean
. La respuesta no será la misma que solicitó el OP, pero parece más útil. Editaré mi respuesta para incluir esto.Rollapply funciona muy bien con un pequeño conjunto de datos. Sin embargo, si está trabajando con varios millones de filas (genómica), es bastante lento.
La siguiente función es súper rápida.
http://coleoguy.blogspot.com/2014/04/sliding-window-analysis.html
fuente
-1
(al rango) y a+1
(al bucle).Esta simple línea de código hace lo siguiente:
si
x
es el vector en cuestión.fuente
(c(0,0,x)+c(0,x,0)+c(x,0,0))/3
para ver a qué me refiero (y cómo funciona). La fórmula adecuada sería:(c(0,0,x)+c(0,x,0)+c(x,0,0))[1:(length(x)-3)*2+1]/3
(debemos cortar el relleno 0 al principio y luego seleccionar los elementos pares.o
fuente
La respuesta de shabbychef en R:
EDITAR: los índices que está buscando son solo
idx1
... esta función se puede modificar fácilmente para devolverlos también, pero es casi igual de rápido recrearlos con otra llamada aseq(1,length(x),by=slide)
.fuente
fromo::running_mean
de la versión de última generación de mi paquete fromo .Puedo hacer esto fácilmente en Matlab y agacharme mientras me bajas el voto:
como efecto secundario,
idx1
es el índice del elemento en la suma. Estoy seguro de que esto se puede traducir fácilmente a R. El idiomafirst:skip:last
en Matlab le da a la matriz first, first + skip, first + 2skip, ..., first + n skip, donde el último elemento de la matriz no es mayor quelast
.editar : había omitido la parte de promedio (dividir por
windowsize
).fuente
Esto le dará los medios de la ventana y el índice del primer valor de la ventana:
Se aplican varias advertencias: no he probado esto con nada más que sus datos de muestra; Creo que agregar marcos de datos como este puede ser realmente lento si tiene muchos valores (porque copiará el marco de datos cada vez); etc. Pero produce lo que pediste.
fuente
rollapply
).rollapply
es mucho más fácil de entender y entender la intención. Además,rollapply
es probable que haya tenido muchos más globos oculares revisando su código que algo que podría preparar una tarde. Caballos de carreras.[i:(i+2)]
a[i:(i+win.size-1)]
haría que el código sea más general, creo.