2010-10-20 24 views
5

Tengo un data.frame que tiene varias columnas. Una de las columnas es el tiempo y, por lo tanto, no es decreciente. El resto de las columnas contiene observaciones registradas en el momento dado por el tiempo especificado en una determinada fila del data.frame.Promedio basado en el tiempo (ventana deslizante) de columnas en un data.frame

Quiero seleccionar una ventana de tiempo, decir "x" segundos, y calcular el promedio (o para el caso de cualquier función) de las entradas en algunas otras columnas en el mismo data.frame para esa ventana.

Por supuesto, debido a que es un promedio basado en el tiempo, el número de entradas en una ventana puede variar dependiendo de los datos. Esto se debe a que el número de filas que pertenecen a una ventana de tiempo determinada puede variar.

He hecho esto usando una función personalizada, que crea una nueva columna en el data.frame. La nueva columna asigna un solo número a todas las entradas en una ventana de tiempo. El número es único en todas las ventanas de tiempo. Esto esencialmente divide los datos en grupos basados ​​en las ventanas de tiempo. Luego utilizo la función "agregada" de R para calcular la media.

Me preguntaba si existe una función R que pueda agrupar según un intervalo de tiempo o si hay una forma mejor (limpia) de hacerlo.

+0

¿Podría proporcionarnos algunos datos de muestra? La mejor solución dependerá de cómo se vean sus datos. –

+0

Me preguntaba si es posible, porque lo hago por mi cuenta, pero consume mucha CPU, así que no sé si tal vez tengo que configurar las ventanas a un valor más grande, de todos modos TY;) – HanniBaL90

Respuesta

4

Suponiendo sus data.frame contiene sólo datos numéricos, esta es una manera de hacerlo utilizando XTS zoológico /:

> Data <- data.frame(Time=Sys.time()+1:20,x=rnorm(20)) 
> xData <- xts(Data[,-1], Data[,1]) 
> period.apply(xData, endpoints(xData, "seconds", 5), colMeans) 
          [,1] 
2010-10-20 13:34:19 -0.20725660 
2010-10-20 13:34:24 -0.01219346 
2010-10-20 13:34:29 -0.70717312 
2010-10-20 13:34:34 0.09338097 
2010-10-20 13:34:38 -0.22330363 

EDIT: el uso de paquetes R sólo de base. Los medios son los mismos, pero los tiempos son ligeramente diferentes porque endpoints comienza el intervalo de 5 segundos con la primera observación. El siguiente código agrupa en intervalos de 5 segundos comenzando con segundos = 0.

+0

Gracias por su respuesta , es correcto, pero todavía estoy interesado en cómo otros lo resolverían usando R – nixbox

+0

Pero esto _es_ usando R ... ¿o está buscando una solución que solo use paquetes base R? –

+0

sí algo usa R o al menos conserva el tipo de data.frame, aunque he comprobado que puedo usar as.data.frame en el xts para convertirlo nuevamente, lo único es que tendría que agregar explícitamente otra columna usando row .names (información de tiempo) para crear gráficos con ggplot2 – nixbox

Cuestiones relacionadas