R: fusionner deux séries chronologiques irrégulières
J'ai deux séries chronologiques multivariées x et y, à la fois couvrant environ la même gamme dans le temps (on commence deux ans avant les autres, mais elles prennent fin à la même date). Les deux séries ont des observations manquantes dans la forme de colonnes vides à côté de la colonne de date, et aussi dans le sens que l'un de la série a plusieurs dates qui ne se trouvent pas dans l'autre, et vice versa.
Je voudrais créer une trame de données (ou similaire) avec une colonne qui contient toutes les dates trouvé dans x OU y, sans dupliquer les dates. Pour chaque date (ligne), je voudrais horizontalement empiler les observations de x suivant les observations de y, avec NA remplit les cellules manquantes. Exemple:
>x
"1987-01-01" 7.1 NA 3
"1987-01-02" 5.2 5 2
"1987-01-06" 2.3 NA 9
>y
"1987-01-01" 55.3 66 45
"1987-01-03" 77.3 87 34
# result I would like
"1987-01-01" 7.1 NA 3 55.3 66 45
"1987-01-02" 5.2 5 2 NA NA NA
"1987-01-03" NA NA NA 77.3 87 34
"1987-01-06" 2.3 NA 9 NA NA NA
Ce que j'ai essayé: avec le forfait zoo, j'ai essayé de la fusion.le zoo de la méthode, mais cela semble juste pile les deux séries uns à côté des autres, avec les dates (comme des numéros, par exemple "1987-01-02" montré que 6210) de chaque série apparaissant dans deux colonnes séparées.
Je me suis assis pendant des heures à arriver presque nulle part, de sorte que toute aide est très appréciée.
EDIT: un peu de code ci-dessous conformément à la suggestion de Soumendra
atcoa <- read.csv(file = "ATCOA_full_adj.csv", header = TRUE)
atcob <- read.csv(file = "ATCOB_full_adj.csv", header = TRUE)
atcoa$date <- as.Date(atcoa$date)
atcob$date <- as.Date(atcob$date)
# only number of observations and the observations themselves differ
>str(atcoa)
'data.frame': 6151 obs. of 8 variables:
$ date :Class 'Date' num [1:6151] 6210 6213 6215 6216 6217 ...
$ max : num 4.31 4.33 4.38 4.18 4.13 4.05 4.08 4.05 4.08 4.1 ...
$ min : num 4.28 4.31 4.28 4.13 4.05 3.95 3.97 3.95 4 4.02 ...
$ close : num 4.31 4.33 4.31 4.15 4.1 3.97 4 3.97 4.08 4.02 ...
$ avg : num NA NA NA NA NA NA NA NA NA NA ...
$ tot.vol : int 877733 89724 889437 1927113 3050611 846525 1782774 1497998 2504466 5636999 ...
$ turnover : num 3762300 388900 3835900 8015900 12468100 ...
$ transactions: int 12 9 24 17 31 26 34 35 37 33 ...
>atcoa[1:1, ]
date a.max a.min a.close a.avg a.tot.vol a.turnover a.transactions
1 1987-01-02 4.31 4.28 4.31 NA 877733 3762300 12
# using timeSeries package
ts.atcoa <- timeSeries::as.timeSeries(atcoa, format = "%Y-%m-%d")
ts.atcob <- timeSeries::as.timeSeries(atcob, format = "%Y-%m-%d")
>str(ts.atcoa)
Time Series:
Name: object
Data Matrix:
Dimension: 6151 7
Column Names: a.max a.min a.close a.avg a.tot.vol a.turnover a.transactions
Row Names: 1970-01-01 01:43:30 ... 1970-01-01 04:12:35
Positions:
Start: 1970-01-01 01:43:30
End: 1970-01-01 04:12:35
With:
Format: %Y-%m-%d %H:%M:%S
FinCenter: GMT
Units: a.max a.min a.close a.avg a.tot.vol a.turnover a.transactions
Title: Time Series Object
Documentation: Wed Aug 17 13:00:50 2011
>ts.atcoa[1:1, ]
GMT
a.max a.min a.close a.avg a.tot.vol a.turnover a.transactions
1970-01-01 01:43:30 4.31 4.28 4.31 NA 877733 3762300 12
# The following will create an object of class "data frame" and mode "list", which contains observations for the days mutual for the two series
>ts.atco <- timeSeries::merge(atcoa, atcob) # produces same result as base::merge, apparently
>ts.atco[1:1, ]
date a.max a.min a.close a.avg a.tot.vol a.turnover a.transactions b.max b.min b.close b.avg b.tot.vol b.turnover b.transactions
1 1989-08-25 7.92 7.77 7.79 NA 269172 2119400 19 7.69 7.56 7.64 NA 81176693 593858000 12
EDIT: problème résolu par (à l'aide de forfait zoo)
atcoa <- read.zoo(read.csv(file = "ATCOA_full_adj.csv", header = TRUE))
atcob <- read.zoo(read.csv(file = "ATCOB_full_adj.csv", header = TRUE))
names(atcoa) <- c("a.max", "a.min", "a.close",
"a.avg", "a.tot.vol", "a.turnover", "a.transactions")
names(atcob) <- c("b.max", "b.min", "b.close",
"b.avg", "b.tot.vol", "b.turnover", "b.transactions")
atco <- merge.zoo(atcoa, atcob)
Merci à vous tous pour votre aide.
source d'informationauteur Benjamin Allévius
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
:
Vous pouvez créer un timeSeries (timeSeries bibliothèque) de l'objet à partir de vos dates, fusionnez-les (timeSeries de fusion par défaut le comportement est différent de zoo et xts et fait exactement ce que vous demandez) et ensuite faire les zoo/xts objets du résultat dans le cas où vous ne voulez pas rester avec timeSeries.
Un moyen rapide de tester est la suivante, en supposant que vous avez deux zoo objets zz1 et zz2 -
Comparer la sortie de la commande ci-dessus avec
Vous pouvez également cbind -
fourni il n'y a pas de colonnes ayant le même nom. Même si ces colonnes sont là, vous pouvez choisir les colonnes qui vous cbind, et vous obtiendrez un objet zoo.
ici, j'ai trouvé un plus générique de l'approche de stat.l'epf de zurich.ch
pour obtenir un ts objet de dos:
Comment à ce sujet: