如何通过R中的循环/函数合并大量的xts对象?

时间:2011-06-16 23:24:54

标签: r time-series xts

我有一个循环,通过调用API来提取~200个单独的时间序列。

循环将时间序列作为xts对象(library(xts))输出到全局环境中,后缀为“.oc”。所以我有200个xts对象,形式为“ABC.oc”,“ABD.oc”等。每个对象包含1000行数据。

我想要做的是编写一个循环(或使用适当的函数),它接受所有“* .oc”对象并按列合并它们。 IE最终会得到:

Date           ABC.oc    ABD.oc -> 200 columns like this
2011-01-01      10         10
2011-01-02      20         20
2011-01-03      30         30
2011-01-04      40         40
2011-01-05      50         50

有一个简短的时间序列表,只需写下:

m <- merge(ABC.oc,ABD.oc,all=FALSE)

但显然这对200个单独的对象来说是不切实际的,所以我想写一个循环将所有这些对象粉碎在一起就像“merge”一样。

通过for i in length(ls(pattern="*.oc")){很容易访问循环的变量,但是无法弄清楚循环的其余部分。 我已经尝试了cbind,但似乎无法做到正确。

任何帮助非常感谢

2 个答案:

答案 0 :(得分:15)

这可以通过获取名称以.oc结尾的所有对象的字符向量,将它们放入列表,然后通过merge调用do.call来实现。

# Make up some data
set.seed(21)
x.oc <- xts(rnorm(10), Sys.Date()-10:1)
y.oc <- xts(rnorm(10), Sys.Date()-10:1)
z.oc <- xts(rnorm(10), Sys.Date()-10:1)
x <- y <- z <- 1:10

objNames <- ls(pattern="*oc$")    # object names
objList <- lapply(objNames, get)  # list of objects
names(objList) <- objNames        # assign names to list
do.call(merge, objList)           # merge all objects in list

如果您将xts对象加载到列表(objList)中,并且从API中收到它们,则使用此方法会更容易。那么你只需要do.call(merge, objList)

答案 1 :(得分:2)

这样的循环应该有效。最好先将它初始化。

library(xts)

m <- xts(matrix(vector(length=length(ls(pattern="*.oc")) * 
  nrow(get(ls(pattern="*.oc")[1]), ncol=nrow(get(ls(pattern="*.oc")[1])), 
  order.by=index(get(ls(pattern="*.oc")[1]))

for (i in 1:length(ls(pattern="*.oc"))) {
  m[, i]  <- get(ls(pattern="*.oc")[i])
}