Question

J'utilise R pour faire des analyses de séries chronologiques en utilisant zoo et chron. J'ai un objet zoo contenant beaucoup de données, et je dois pouvoir utiliser la fonction window pour sous-regrouper les données en un seul jour, puis les prochains jours, puis les suivants, etc.

J'ai essayé de trouver le moyen le plus simple de créer un tableau avec la date de chaque jour à une certaine période et j'ai trouvé ce qui suit:

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

Ceci utilise la notation du jour julien et compte 1825 jours (365 * 5 - donc cinq ans), en commençant par le premier jour de ma période de date. J'essaye ensuite de faire une boucle for en utilisant chacun des éléments de ce tableau:

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)
}

Cependant, cela me donne un avertissement disant que j'utilise des origines différentes pour l'objet zoo aeronet et les variables s et e, et il ne sélectionne aucune donnée.

Y a-t-il une meilleure façon de procéder? Ou un moyen de résoudre ce problème? Fondamentalement, ce que je veux, c'est exécuter une boucle for où, dans la boucle, je peux utiliser le code aeronet_day = window(aeronet, start=s, end=e) pour produire un objet zoo contenant les données pour un jour (par exemple, 1er mai 2005 de 00:00:00 à 23:59:59.

Était-ce utile?

La solution

Supposons que nous ayons ces données:

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

1) agréger La fonction R aggregate a une méthode zoo. Le deuxième argument est ce par quoi nous agrégons. S'il s'agit d'une fonction, elle est appliquée à l'index de l'objet zoo. par exemple. ici nous calculons la moyenne pour chaque date:

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

Nous pouvons remplacer mean par une fonction plus complexe si nous le souhaitons.

2) fractionné . La fonction R split a une méthode zoo. Si nous voulons vraiment diviser z par date, nous pouvons le faire. Ici, z.split.list est une liste dont chacun des composants contient l'objet zoo pour une date.

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

Maintenant (a) sapply ou (b) lapply sur cette liste ou (c) utilisez ce qui suit (en remplaçant print(zc) par le traitement souhaité). Ici, zc est un composant de la liste, c'est-à-dire qu'il s'agit de l'objet zoo formé en prenant simplement une date particulière:

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

Notez que as.Date(time(z)) est un vecteur dont les dates correspondent aux éléments de z.

MODIFIER:

Diverses élaborations mineures.

Autres conseils

Je ne suis pas familier avec zoo, mais en général je convertis simplement la date en numérique, puis je crée la séquence, puis je reconvertis.Par exemple:

> 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 vous voulez faire quelque chose par date, ce que vous avez est parfait.

Quelques exemples de données aeronet.

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")
  )
)

Vous pouvez maintenant diviser les données par date en utilisant split, ou appliquer une fonction à chaque date avec tapply ou ddply de plyr (ou utiliser aggregate ou autre).

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

library(plyr)
ddply(aeronet, .(date), summarise, sum(some.value))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top