2012-04-22 46 views
2

我想合併三個XTS與cbind一起對象:[R cbind XTS對象結果添加/重複行

> OIH.tmp <- 
structure(c(NA, 7.7, 5.1, -6.9, -2.6), index = structure(c(1325221200, 
1327986000, 1330491600, 1333080000, 1334894400), tzone = "", tclass = "yearmon"), 
tclass = "Date", tzone = "", src = "yahoo", updated = structure(1335041586.83363, 
class = c("POSIXct", "POSIXt")), .indexTZ = "", .indexCLASS = "yearmon", 
.Dim = c(5L, 1L), .Dimnames = list(NULL, "OIH"), class = c("xts", "zoo")) 

> SMH.tmp <- 
structure(c(NA, 9.3, 2.9, 3.7, -5), index = structure(c(1325134800, 
1327986000, 1330491600, 1333080000, 1334894400), tzone = "", tclass = "yearmon"), 
tclass = "Date", tzone = "", src = "yahoo", updated = structure(1335041596.41175, 
class = c("POSIXct", "POSIXt")), .indexTZ = "", .indexCLASS = "yearmon", 
.Dim = c(5L, 1L), .Dimnames = list(NULL, "SMH"), class = c("xts", "zoo")) 

> SU.tmp <- 
structure(c(NA, -9.4, -6.9, -2.3, -18.1, -22.6, 22.7, -6.1, -4, 
18, 4.1, -9.4, -4.7), index = structure(c(1304049600, 1306814400, 
1309406400, 1311912000, 1314763200, 1317355200, 1320033600, 1322629200, 
1325221200, 1327986000, 1330491600, 1333080000, 1334894400), tzone = "", 
tclass = "yearmon"), tclass = "Date", tzone = "", src = "yahoo", 
updated = structure(1335041613.0055, class = c("POSIXct", "POSIXt")), 
.indexTZ = "", .indexCLASS = "yearmon", .Dim = c(13L, 1L), 
.Dimnames = list(NULL, "SU"), class = c("xts", "zoo")) 

> cbind(OIH.tmp, SU.tmp, SMH.tmp) 
      OIH SU SMH 
Apr 2011 NA NA NA 
May 2011 NA -9.4 NA 
Jun 2011 NA -6.9 NA 
Jul 2011 NA -2.3 NA 
Aug 2011 NA -18.1 NA 
Sep 2011 NA -22.6 NA 
Oct 2011 NA 22.7 NA 
Nov 2011 NA -6.1 NA 
Dec 2011 NA NA NA 
Dec 2011 NA -4.0 NA 
Jan 2012 7.7 18.0 9.3 
Feb 2012 5.1 4.1 2.9 
Mar 2012 -6.9 -9.4 3.7 
Apr 2012 -2.6 -4.7 -5.0 

注意,有一個額外的/重複的行爲2011年12月,我不想。我可以想出一些混亂的方式來實現我的最終目標(here),但我確定必須有一些更簡單/更優雅的東西 - 也許是通過一個對象的索引進行合併。這看起來很簡單,但我已經閱讀了cbind和merge的文檔,並沒有找到一個簡單的解決方案。

我實際上有一系列我想合併/合併的對象。我只是用你在這裏看到的3來說明問題。我實際上使用以下命令構建返回系列:

oneMonthReturn <- do.call(merge, lapply(tickers.tmp, function(x) 
    round(ROC(Cl(to.monthly(get(x, myEnv))),1) * 100, 1))) 

> dput(tickers.tmp) 
c("DJI", "GSPC", "IXIC", "GSPTSE", "XLE", "OIH", "XOP", "XLI", 
"XLB", "XLF", "XRT", "XLK", "SMH", "XLY", "XLP", "XLU", "XLV", 
"PPH", "MOO", "GLD", "SLV", "GDX", "TLT", "X", "SU", "TCK", "ACHN", 
"IDIX", "AGU") 


> dput(oneMonthReturn) 
structure(c(NA, -1.9, -1.2, -2.2, -4.5, -6.2, 9.1, 0.8, NA, 1.4, 
3.3, 2.5, 2, -1.4, NA, -1.4, -1.8, -2.2, -5.8, -7.4, 10.2, -0.5, 
NA, 0.8, 4.3, 4, 3.1, -2.1, NA, -1.3, -2.2, -0.6, -6.6, -6.6, 
10.6, -2.4, NA, -0.6, 7.7, 5.3, 4.1, -3, NA, -1, -3.7, -2.7, 
-1.4, -9.4, 5.3, -0.4, NA, -2.1, 4.1, 1.5, -2, -2, NA, -4.3, 
-2.3, 1.4, -10.8, -16, 17.5, 1.7, NA, -2.5, 2.2, 5.8, -4.3, -4, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 7.7, 5.1, -6.9, -2.6, 
NA, -4.5, -3.5, 5.7, -14.8, -22.5, 22.8, 2.4, NA, -4.6, 3.5, 
8.3, -4.1, -7.7, NA, -2.8, -1, -7.1, -6.8, -10.3, 13.4, 1.4, 
NA, -0.4, 7.1, 2.8, 0.5, -1.8, NA, -2.8, -1, -3.5, -7.3, -18.5, 
16, 0.2, NA, -3, 10.4, -0.6, 0, -1.3, NA, -3.4, -3.1, -3.6, -10.1, 
-12.5, 13.4, -5.2, NA, 1.5, 7.8, 4.9, 6.8, -3.9, NA, 1.5, -1.4, 
-0.2, -7.1, -7.1, 12.9, -1.3, NA, 1.3, 4.8, 6.5, 3.9, -0.5, NA, 
-1.1, -2.9, 0.4, -5.5, -3.5, 9.7, -1.5, NA, -0.7, 6, 6.9, 4.1, 
-3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 9.3, 2.9, 3.7, -5, 
NA, -0.3, -0.6, -1.4, -5.4, -7.5, 11.3, -0.7, NA, 0.7, 5.7, 4.4, 
4.3, -1, NA, 2.5, -3.4, -1.3, 0.2, -4.1, 4.5, 2.7, NA, 1.8, -1.4, 
3.7, 2.5, 0.7, NA, 2.1, -1.2, -0.9, 2.1, -0.8, 3.6, 1, NA, 2.2, 
-3.7, 0.6, 0.4, -0.1, NA, 2.4, -1.6, -4, -2.1, -5.1, 5.6, 0.9, 
NA, 2.4, 3.1, 1.1, 3.9, -0.9, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 0, 2.5, 3, 0.2, NA, -2.4, -3.1, 0.6, -3.6, -18.9, 14.6, 
-1.6, NA, -4.4, 8.5, 2.5, 0.4, -1.5, NA, -1.8, -2.5, 8.1, 11.6, 
-11.7, 5.7, 1.7, NA, -11.3, 10.8, -3, -1.3, -1.6, NA, -22.1, 
-10.5, 13.8, 4, -33.6, 14.6, -4.4, NA, -17.2, 18.1, 3.9, -6.7, 
-2, NA, -6.7, -6.3, 4.1, 9.9, -12.9, 6.4, 2.7, NA, -16.1, 9.3, 
-1.9, -11.2, -7.2, NA, 2.9, -2.7, 4, 8.9, 12.1, -4.2, 1.7, NA, 
2.8, -0.3, -2.9, -4.6, 4.2, NA, -3.4, -0.2, -14.1, -28.4, -31.3, 
14.2, 7.4, NA, -3.1, 13.2, -10.4, 7.6, -1.3, NA, -9.4, -6.9, 
-2.3, -18.1, -22.6, 22.7, -6.1, NA, -4, 18, 4.1, -9.4, -4.7, 
NA, -3.1, -3.5, -2.6, -10.9, -41.8, 31.8, -9.4, NA, -3.6, 18.4, 
-5.7, -11.4, 3.5, NA, 29.4, -0.7, -0.4, -18.8, -26.3, 29.2, 5.1, 
NA, 13.6, 37.5, -5.5, -9.2, -14.6, NA, -6.7, 5.1, 29, -14, -15.2, 
18.4, 23.6, NA, -2, 58.6, -12.8, -18.5, -16.9, NA, -2.7, -0.3, 
-0.4, -1.6, -25.4, 21.1, -16.2, NA, -4.2, 17.9, 5.9, 1.4, 0.2 
), .Dim = c(14L, 29L), .Dimnames = list(NULL, c("DJI", "GSPC", 
"IXIC", "GSPTSE", "XLE", "OIH", "XOP", "XLI", "XLB", "XLF", "XRT", 
"XLK", "SMH", "XLY", "XLP", "XLU", "XLV", "PPH", "MOO", "GLD", 
"SLV", "GDX", "TLT", "X", "SU", "TCK", "ACHN", "IDIX", "AGU")), index = structure(c(1304049600, 
1306814400, 1309406400, 1311912000, 1314763200, 1317355200, 1320033600, 
1322629200, 1325134800, 1325221200, 1327986000, 1330491600, 1333080000, 
1334894400), tzone = "", tclass = "yearmon"), .indexTZ = "", .indexCLASS = "yearmon", tclass = c("POSIXct", 
"POSIXt"), tzone = "", src = "yahoo", updated = structure(1335041583.80238, class = c("POSIXct", 
"POSIXt")), class = c("xts", "zoo")) 

感謝幫助。

+0

請加入到這個問題,有些方法可以輕鬆地構建數據。對你來說一個簡單的方法(但不是完全可讀的)是粘貼dput(OIH.tmp)的輸出等。除非你已經有了人類可讀的命令,當然。我沒有解決方案,但我對這個問題感興趣。 – 2012-04-22 00:53:07

+0

@MatthewLundberg - 感謝您的快速回復。如果有幫助,我只是用更多的信息更新了我的文章的正文。欣賞它。 – codingknob 2012-04-22 01:39:33

+0

這似乎是'merge.xts'中的一個錯誤,因爲'merge(as.zoo(OIH.tmp),as.zoo(SU.tmp),as.zoo(SMH.tmp)''有效。我會調查。 – 2012-04-22 09:53:40

回答

2

的問題與您的來電to.monthly,不與merge.xts(因爲我本來以爲)。此解決方案不適用於當前在CRAN上的xts版本,但它可以與R-forge的修訂版613或更高版本一起使用。

問題的產生是因爲to.monthly將實際指數中該期末的最後一個時間序列對齊,而不是該期間的理論最後一個時間;並且它不會默認刪除索引的時間分量。在你的情況下,2011-12的最後一次是2011-12-29的SMH和2011-12-30的其他兩個對象。

如果設置drop.time=TRUE(再次這隻當前工作與XTS的R-鍛造版),結果如你預期:

oneMonthReturn <- do.call(merge, lapply(tickers.tmp, function(x) 
    round(ROC(Cl(to.monthly(get(x, myEnv),drop.time=TRUE)),1) * 100, 1))) 
3

這應該這樣做(在大亞灣簡單,你沒有張貼您的數據dput()):

newvar <- merge(merge(OIH.tmp, SU.tmp), SMH.tmp) 

merge.xts()只需要兩個參數,所以你必須多次調用它。默認聚合「做正確的事」在這裏:

R> OIH <- xts(c(NA, 1:4), 
+    order.by=seq(as.Date("2011-12-01"), by="1 month", length=5)) 
R> SMH <- xts(c(NA, 1:4), 
+    order.by=seq(as.Date("2011-12-01"), by="1 month", length=5)) 
R> SU <- xts(c(NA, 1:12), 
+   order.by=seq(as.Date("2011-04-01"), by="1 month", length=13)) 
R> merge(OIH, merge(SU, SMH)) 
      OIH SU SMH 
2011-04-01 NA NA NA 
2011-05-01 NA 1 NA 
2011-06-01 NA 2 NA 
2011-07-01 NA 3 NA 
2011-08-01 NA 4 NA 
2011-09-01 NA 5 NA 
2011-10-01 NA 6 NA 
2011-11-01 NA 7 NA 
2011-12-01 NA 8 NA 
2012-01-01 1 9 1 
2012-02-01 2 10 2 
2012-03-01 3 11 3 
2012-04-01 4 12 4 
R> 
+0

我是否正確地認爲合併順序無關緊要? – 2012-04-22 01:06:45

+0

正確,因爲我剛剛通過玩相同的數據進行驗證。這裏很容易,因爲我們只有兩種不同的長度。 – 2012-04-22 01:19:21

+0

@Dirk - 感謝您的幫助和示例。我只是用更多的數據更新了我的問題的正文。有沒有一種更簡單的方法來組合對象,而無需手動將「NA」插入到長度較短的對象中?感謝幫助。 – codingknob 2012-04-22 01:35:15

0

對於多合併(使用德克的數據)多列,你可以使用Reduce功能。我將這個用法封裝在一個可以調整的功能中,以滿足您的需求。正確回答這個問題的信用應該去德克,因爲他已經正確回答了,這只是一個替代方法,因爲我在週六晚上很無聊:)拍攝,我甚至不知道什麼是XT。

multi.xts.merge <- function(listOguys) { 
    dat <- Reduce(function(x, y) {merge.xts(x, y)}, listOguys) 
    names(dat) <- as.character(substitute(listOguys))[-1] 
    return(dat) 
} 

multi.xts.merge(list(OIH, SU, SMH)) 

請注意,您必須提供一個清單,這個功能

+0

這對'merge.default'和'merge.data.frame'非常有用,因爲它們一次只能合併兩個對象。 'merge.xts'和'merge.zoo'可以同時合併兩個以上的對象,所以重複的調用是不必要的。我沒有測試過,但'do.call(merge.xts,list(OIH,SU,SMH))'可能比'Reduce'調用更有效率。 – 2012-04-22 09:41:10