Как объединить большой список объектов xts через цикл / функцию в R?

у меня есть цикл, который извлекает ~200 отдельных временных рядов, делая вызовы API.

цикл выводит временные ряды как объекты xts (library(xts)) в глобальную среду с суффиксом ".oc". Таким образом, у меня есть 200 объектов xts формы "ABC.oc", " ABD.oc " etc. Каждый объект содержит 1000 строк данных.

то, что я хотел бы сделать, это написать цикл (или использовать соответствующую функцию), который принимает все "*.OC " объекты и объединяет их по столбцам. Т. е. в итоге с:

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, но не могу понять это правильно.

любая помощь очень ценится

2 ответов


это можно сделать, получив вектор символов всех объектов с именами, заканчивающимися на .oc, помещая их в список, затем вызывая merge via 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).


такой цикл должен работать. Всегда хорошая идея, чтобы инициализировать его первым.

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])
}