10

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

循环将时间序列作为 xts 对象 ( library(xts)) 输出到带有后缀“.oc”的全局环境中。所以我有 200 个“ABC.oc”、“ABD.oc”等形式的 xts 对象。每个对象包含 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 个单独的对象是不切实际的,所以我想编写一个循环来将所有这些对象粉碎在一起,就像“合并”一样。

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

非常感谢任何帮助

4

2 回答 2

16

这可以通过获取名称以 结尾的所有对象的字符向量.oc,将它们放在一个列表中,然后调用mergevia 来实现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

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

于 2011-06-17T00:29:17.257 回答
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])
}
于 2011-06-16T23:45:49.767 回答