Pregunta

Estoy usando R para hacer un análisis de series de tiempo usando Zoo y Chron. Tengo un objeto de zoológico con muchos datos y necesito poder usar el window Funcionar para subcontar los datos a solo un día de un día, luego los próximos días, luego el siguiente, etc.

He tratado de encontrar la forma más fácil de crear una matriz con la fecha de cada día en un cierto período y he encontrado lo siguiente:

orig = c(month=1, day=1, year=2005)
dates <- chron(1:1825, origin=orig, out.format=c(dates="d/m/y", times="h:m"))

Esto usa la notación del Día Julian y tiene 1825 días (365*5, así que cinco años), comenzando con el primer día de mi período de fecha. Luego trato de hacer un bucle for usando cada uno de los elementos de esta matriz:

for (date in dates)
{
  s = chron(date, "00:00:00", origin=orig)
  e = chron(date, "23:59:59", origin=orig)

  aeronet_day = window(aeronet, start=s, end=e)
}

Sin embargo, esto me da una advertencia que dice que estoy usando diferentes orígenes para el aeronet objeto de zoológico y el s y e variables, y no selecciona ningún dato.

¿Hay una mejor manera de hacer esto? ¿O una forma de solucionar esto? Básicamente, lo que quiero es ejecutar un bucle for donde en el bucle puedo usar el aeronet_day = window(aeronet, start=s, end=e) Código para producir un objeto Zoo que contenga los datos durante un día (por ejemplo, el 1 de mayo de 2005 de 00:00:00 a 23:59:59.

¿Fue útil?

Solución

Supongamos que tenemos estos datos:

# create test data
library(zoo)
library(chron)
z <- zooreg(1:30, start = chron("2000-01-01"), freq = 2)

1) agregadoEl r aggregate La función tiene un método de zoológico. El segundo argumento es por lo que nos agregamos. Si es una función, se aplica al índice del objeto Zoo. Por ejemplo, aquí calculamos la media para cada fecha:

z.ag <- aggregate(z, as.Date, mean)

Podemos reemplazar mean con una función más compleja si lo deseamos.

2) Split. El r split La función tiene un método de zoológico. Si realmente queremos separarnos z Por fecha, entonces podemos hacer esto. Aquí z.split.list es una lista, cada uno de cuyos componentes contiene el objeto Zoo para una fecha.

z.split.list <- split(z, as.Date(time(z)))

Ahora (a) sapply o (b) lapply sobre esa lista o (c) use lo siguiente (reemplazar print(zc) con cualquier procesamiento que se desee). Aquí zc es un componente de la lista, es decir, es el objeto del zoológico formado simplemente tomando una fecha en particular:

for(zc in z.split.list) print(zc)

Tenga en cuenta que as.Date(time(z)) es un vector con las fechas correspondientes a los elementos de z.

EDITAR:

Varias elaboraciones menores.

Otros consejos

No estoy familiarizado con el zoológico, pero generalmente solo convierto la fecha en un numérico, luego hago la secuencia y luego vuelvo de nuevo. Por ejemplo:

> as.Date(Sys.Date():(Sys.Date()+365), origin='1970-01-01')
  [1] "2011-12-06" "2011-12-07" "2011-12-08" "2011-12-09" "2011-12-10" "2011-12-11" "2011-12-12" "2011-12-13"
  [9] "2011-12-14" "2011-12-15" "2011-12-16" "2011-12-17" "2011-12-18" "2011-12-19" "2011-12-20" "2011-12-21"
 [17] "2011-12-22" "2011-12-23" "2011-12-24" "2011-12-25" "2011-12-26" "2011-12-27" "2011-12-28" "2011-12-29"
 [25] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06"
 [33] "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" "2012-01-11" "2012-01-12" "2012-01-13" "2012-01-14"
 [41] "2012-01-15" "2012-01-16" "2012-01-17" "2012-01-18" "2012-01-19" "2012-01-20" "2012-01-21" "2012-01-22"
...

Si desea hacer algo por fecha, lo que tiene está bien.

Alguna muestra aeronet datos.

last_date <- 1825
n <- 10000
aeronet <- data.frame(
  some.value = seq_len(n), 
  date = as.chron(
    runif(n, 0, last_date), 
    origin = orig,
    out.format = c(dates = "d/m/y", times = "h:m")
  )
)

Ahora puede dividir los datos por fecha utilizando split, o aplique una función a cada fecha con tapply o ddply de plyr (o usar aggregate o lo que sea).

with(aeronet, split(some.value, date))
with(aeronet, tapply(some.value, date, sum))

library(plyr)
ddply(aeronet, .(date), summarise, sum(some.value))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top