Как объединить большой список объектов 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])
}