2017-07-04 1 views
0

Il existe plusieurs objets XTS. Chacun contient une seule colonne (de prix). Les objets peuvent avoir des longueurs différentes. Je veux les fusionner par l'index. Je peux fusionner deux objets XTS avec merge.xts. Mais je veux fusionner plusieurs (avec une seule fonction, sans répéter le processus de fusion plusieurs fois).Fusion de plusieurs objets XTS par index

J'ai donc appliqué l'approche recommandée here. Ça marche. Juste un problème: il fusionne toutes les données dans une colonne, plutôt que plaçant chaque objet XTS à fusionner dans sa propre colonne. par exemple. Dans l'exemple reproductible, le résultat final souhaité est que XTSM ait 3 colonnes.

Comment cela peut-il être réalisé? Je vous remercie.

library('xts') 

#Data 
XTS1 <- structure(c(125.26, 125.14, 125.21, 125.26, 125.21, 125.26, 125.24, 125.22, 125.3, 125.32, 125.38, 125.38, 125.29, 125.26, 125.3, 125.25, 125.29, 125.37, 125.21, 125.3, 125.25, 125.24, 125.21, 125.24, 125.24, 125.26, 125.23, 125.23), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "", tzone = "", .CLASS = "double", index = structure(c(1403537400, 1403538300, 1403539200, 1403540100, 1403541000, 1403541900, 1403542800, 1403543700, 1403544600, 1403545500, 1403546400, 1403547300, 1403548200, 1403549100, 1403550000, 1403550900, 1403551800, 1403552700, 1403553600, 1403554500, 1403555400, 1403556300, 1403557200, 1403560800, 1403561700, 1403562600, 1403563500, 1403564400), tzone = "", tclass = c("POSIXct", "POSIXt")), .Dim = c(28L, 1L)) 
XTS2 <- structure(c(1867, 1867, 1868.5, 1868.75, 1868.75, 1868.75, 1868.25, 1867.25, 1867.5, 1867.75, 1868, 1868.25, 1868.25, 1868.75, 1868, 1868.5, 1869, 1869.75, 1868.75, 1868.5, 1868.25, 1867.5, 1867, 1866.75, 1866.75, 1867, 1867.5), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "", tzone = "", .CLASS = "double", index = structure(c(1403537400, 1403538300, 1403539200, 1403540100, 1403541000, 1403541900, 1403542800, 1403543700, 1403544600, 1403545500, 1403546400, 1403547300, 1403548200, 1403549100, 1403550000, 1403550900, 1403551800, 1403552700, 1403553600, 1403555400, 1403556300, 1403557200, 1403560800, 1403561700, 1403562600, 1403563500, 1403564400), tzone = "", tclass = c("POSIXct", "POSIXt")), .Dim = c(27L, 1L)) 
XTS3 <- structure(c(1867, 1867, 1868.5, 1868.75, 1868.75, 1868.75, 1868.25, 1867.25, 1867.5, 1867.75, 1868, 1868.25, 1868.25, 1868.75, 1868, 1868.5, 1869, 1869.75, 1868.75, 1868.5, 1868.25, 1867.5, 1867, 1866.75, 1866.75, 1867, 1867.5), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "", tzone = "", .CLASS = "double", index = structure(c(1403537400, 1403538300, 1403539200, 1403540100, 1403541000, 1403541900, 1403542800, 1403543700, 1403544600, 1403545500, 1403546400, 1403547300, 1403548200, 1403549100, 1403550000, 1403550900, 1403551800, 1403552700, 1403553600, 1403555400, 1403556300, 1403557200, 1403560800, 1403561700, 1403562600, 1403563500, 1403564400), tzone = "", tclass = c("POSIXct", "POSIXt")), .Dim = c(27L, 1L)) 

#Following code merges 2 xts objects into a 2 column xts 
XTSM <- merge(XTS1,XTS2, all=TRUE) 

#Following code merges multiple xts objects into a 1 column xts 
XTSlist <- list(XTS1, XTS2, XTS3) 

do.call.rbind <- function(lst) { 
    while(length(lst) > 1) { 
    idxlst <- seq(from=1, to=length(lst), by=2) 
    lst <- lapply(idxlst, function(i) { 
     if(i==length(lst)) { return(lst[[i]]) } 
     return(rbind(lst[[i]], lst[[i+1]])) 
    }) 
    } 
    lst[[1]] 
} 

XTSM <- do.call.rbind (XTSlist) 
+1

'merge.xts' accepte plus de 2 objets xts. Voir '? Merge.xts' –

+0

En effet, il le fait. Cela a résolu le problème. Pour une raison étrange lorsque j'ai essayé plusieurs objets avec 'merge.xts' avant que je recevais un message d'erreur. Merci. – Krug

+2

Notez que 'merge.xts' n'accepte que deux arguments si' join' n'est pas '' all ''. Notez également que vous devriez simplement appeler 'merge()'. Ce n'est pas une bonne pratique d'appeler des méthodes directement. Il n'y a rien qui vous empêche d'appeler, par exemple 'merge.xts (data.frame (...))', qui pourrait avoir des résultats inattendus. –

Répondre

1

Joshua répondre à la question dans les commentaires. Poster une solution pour répondre au Q Il est aussi simple que ceci:

XTSM.T <- merge(XTS1,XTS2,XTS3, all=TRUE) 

or 

XTSM.F <- merge(XTS1,XTS2,XTS3, all=FALSE)