2017-07-04 10 views
0

複数のXTSオブジェクトがあります。それぞれには(価格の)1つの列のみが含まれています。 オブジェクトの長さが異なる可能性があります。 にインデックスをマージします。 2つのXTSオブジェクトをmerge.xtsにマージできます。しかし、複数のマージ処理を何度も繰り返すことなく、複数の を1つの機能でマージしたいと思います。インデックスで複数のXTSオブジェクトをマージする

私は推奨されたアプローチhereを適用しました。できます。たった1つの問題:ではなく、すべてのデータを1つの列にマージします。にマージする各XTSオブジェクトを配置します。例えば再現可能な例では、所望の最終結果はXTSMが3つの列を有することである。

どのように達成できますか?ありがとうございました。

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」は2つ以上のxtsオブジェクトを受け入れます。 '?merge.xts'を参照してください。 –

+0

実際そうです。それが問題を解決しました。いくつかの奇妙な理由から、エラーメッセージが出る前に 'merge.xts'で複数のオブジェクトを試してみました。ありがとう。 – Krug

+2

'merge.xts'は' join 'が '' all "'でなければ2つの引数しか受け付けないことに注意してください。また、 'merge()'を呼び出すだけでよいことにも注意してください。メソッドを直接呼び出すのは良い方法ではありません。たとえば、 'merge.xts(data.frame(...)) 'のような呼び出しを止めることは何もありません。予期しない結果を招く可能性があります。 –

答えて

1

ジョシュアはコメントに質問に答えます。 Qを回答させるための投稿ソリューション。これは次のように簡単です:

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

or 

XTSM.F <- merge(XTS1,XTS2,XTS3, all=FALSE) 
関連する問題