Manipulación de datos de series temporales en R

¿Cuál sería una buena manera de manipular el siguiente tipo de datos de series de tiempo en R:

username;variable;2012-01-01;2012-01-15;2012-02-01;2012-03-01;2012-04-01;2012-05-01;2012-07-02 
user1;var1;5;5;5;5;6;6;6
user1;var2;0;0;1;0;0;1;1
user1;var3;9;9;9;9;9;9;9
user2;var1;4;4;4;4;4;6;6
user2;var2;0;0;1;1;1;1;1
user2;var3;4;4;4;9;9;9;9

Los datos contienen un conjunto de series de tiempo para cada usuario monitoreado. Mi objetivo es tener los datos en un formato tal que pueda realizar consultas fácilmente sobre este conjunto de datos para "deltas". Es decir, a partir de un cierto punto en el tiempo puedo mirar hacia atrás y calcular cuánto tiempo hace que cambió una determinada variable y también obtener el valor original y el nuevo valor de esta consulta.

Una función que simplemente tomaría una fecha y un nombre de variable como argumento sería perfecta, por ejemplo, fun(2012-07-02, var1), fun(2012-02-17, var1) or fun(2014-09-02, var1) devolvería cuatro columnas: username,original_value;new_value;days_since_change.

¿Hay R paquetes o fragmentos de código que podrían hacer algo similar?

preguntado el 02 de julio de 12 a las 12:07

Cómo podría date1-7 mapa para 2012-07-02? -

Mal ejemplo, date1-7 son en realidad fechas en formato aaaa-mm-dd. Lo corregiré. -

No estoy seguro de su respuesta, pero creo que el paquete data.table podría ser muy útil. -

Entonces en tu ejemplo fun, --He editado para hacer que la última fecha sea julio -- ya que julio de 2012 está fuera de rango, ¿sería su salida user1,5,5,4 y user2,4,6,3 ? -

La función devolvería el resultado para todos los usuarios. para usuario1 user1;5;6;92 y para usuario2 user2;4;6;62. es decir, cuál fue el cambio de valor y cuántos días han pasado desde este cambio. Entonces ahora la fecha especificada en la función está fuera de rango. -

1 Respuestas

Aquí le mostramos cómo transformar su tabla en un formato fácil de trabajar. el truco para usar el reshape2 paquete y melt tu información.

my.table <-read.table(text="username;variable;2012-01-01;2012-01-15;2012-02-01;2012-03-01;2012-04-01;2012-05-01;2012-07-02
user1;var1;5;5;5;5;6;6;6
user1;var2;0;0;1;0;0;1;1
user1;var3;9;9;9;9;9;9;9
user2;var1;4;4;4;4;4;6;6
user2;var2;0;0;1;1;1;1;1
user2;var3;4;4;4;9;9;9;9",sep=";", header=TRUE)

library(reshape2)
res <-melt(my.table,id.vars=c("username","variable") )    #melt on the first two columns
colnames(res)[3] <-"Date"
res$Date <-as.Date(res$Date,format="X%Y.%m.%d")           #transform into date format

out <-res[res$username=="user1" & res$variable=="var1",]  #request user1 and var1
out

   username variable       Date value
1     user1     var1 2012-01-01     5
7     user1     var1 2012-01-15     5
13    user1     var1 2012-02-01     5
19    user1     var1 2012-03-01     5
25    user1     var1 2012-04-01     6
31    user1     var1 2012-05-01     6
37    user1     var1 2012-07-02     6

no entiendo que quieres cuando dices original_value;new_value;days_since_change pero con los datos extraídos de esa manera, estoy seguro de que puedes resolverlo.

Respondido 02 Jul 12, 17:07

Gracias. Agregué un comentario y edité mi publicación original donde explico mi salida fun() un poco más de cerca. Melt podría ser una buena solución, pero desconfío un poco del tamaño de la tabla: hay millones de usuarios, algunos cientos de fechas y alrededor de diez variables. - Joshua

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.