2014-07-11 10 views
0

J'ai un data.frame de plusieurs séries chronologiques irrégulières (data.frame) qui ressemble à ceConvertir plusieurs séries chronologiques irrégulières dans des séries chronologiques régulières

station Time  WaterTemp 
1  01-01-1974 5.0000000 
1  01-02-1974 5.0000000 
1  01-03-1974 8.6000004 
1  01-05-1974 8.1333332 
1  01-07-1974 12.7999999 
2  01-01-1974 5.0000000 
2  01-02-1974 5.0000000 
2  01-04-1974 8.6000004 
2  01-06-1974 8.1333332 
2  01-08-1974 12.7999999 

Je veux convertir en séries chronologiques régulières (ts) objet qui devrait ressembler à ceci

Time  Staion1  Station2 
Jan1974 5.0000000 5.0000000 
Feb1974 5.0000000 5.0000000 
Mar1974 8.6000004 NA 
Apr1974 NA   8.6000004 
May1974 8.1333332 NA 
June1974 NA   8.1333332 
July1974 12.7999999 NA 
    Aug1974 NA   12.7999999 
    Sep1974 NA   NA 
    Oct1974 7.9   NA 
    Nov1974 NA   NA 
    Dec1974 NA   7.4 

Comment faire? Bien qu'il y ait beaucoup de solutions pour une seule série chronologique, je n'en ai pas rencontré une traitant de séries chronologiques multiples.

Merci,

Répondre

1

Si DF est votre trame de données puis essayez ceci. Conversion en ts dans la dernière ligne fait régulièrement et nous reconvertir zoo:

library(zoo) 
z <- read.zoo(DF, split = 1, index = 2, format = "%d-%m-%Y") 
z.ym <- aggregate(z, as.yearmon, identity) # convert to yearmon 
zm <- aggregate(as.zoo(as.ts(z.ym)), as.yearmon, identity) 

Une alternative à la dernière ligne serait ces deux lignes:

g <- zoo(, seq(start(z.ym), end(z.ym), deltat(z.ym))) # grid 
zm <- merge(z.ym, g) 

Dans les deux cas, à ce le point coredata(zm) est la partie de données et time(zm) est l'index bien que vous souhaitiez le conserver comme objet zoo afin que vous puissiez utiliser ses autres fonctions de séries chronologiques et les nombreux autres packages qui acceptent les séries chronologiques de ce formulaire.

Note: Voici un exemple reproductible autonome complète:

DF <- structure(list(station = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L), Time = structure(c(1L, 2L, 3L, 5L, 7L, 1L, 2L, 4L, 6L, 8L 
), .Label = c("01-01-1974", "01-02-1974", "01-03-1974", "01-04-1974", 
"01-05-1974", "01-06-1974", "01-07-1974", "01-08-1974"), class = "factor"), 
    WaterTemp = c(5, 5, 8.6000004, 8.1333332, 12.7999999, 5, 
    5, 8.6000004, 8.1333332, 12.7999999)), .Names = c("station", 
"Time", "WaterTemp"), class = "data.frame", row.names = c(NA, 
-10L)) 

library(zoo) 
z <- read.zoo(DF, split = 1, index = 2, format = "%d-%m-%Y") 
z.ym <- aggregate(z, as.yearmon, identity) # convert to yearmon 
zm <- aggregate(as.zoo(as.ts(z.ym)), as.yearmon, identity) 

donnant:

> zm 
       1   2 
Jan 1974 5.000000 5.000000 
Feb 1974 5.000000 5.000000 
Mar 1974 8.600000  NA 
Apr 1974  NA 8.600000 
May 1974 8.133333  NA 
Jun 1974  NA 8.133333 
Jul 1974 12.800000  NA 
Aug 1974  NA 12.800000 

Mise à jour Quelques corrections et améliorations.

+0

Oh! Génial! mais que faire si je veux convertir le format de date en yearmon et aussi remplir les mois manquants dans l'année? – Arora

+0

Avoir une réponse mise à jour. –

+0

juste essayé en utilisant votre code. après l'exécution de la dernière étape donne l'erreur suivante: Erreur dans zoo (coredata (rval), index): "x": tentative de définir l'objet zoo invalide – Arora

Questions connexes