2011-06-16 57 views
8

我有一個循環通過調用API來提取〜200個人時間序列。如何通過R中的循環/函數合併大量xts對象?

循環將時間序列作爲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的單個對象的實際,所以我想寫一個循環將所有這些對象一起粉碎,就像「合併」一樣。

很容易通過for i in length(ls(pattern="*.oc")){訪問循環的變量,但只是無法弄清楚循環的其餘部分。 我已經嘗試過cbind,但似乎無法做到。

非常感謝任何幫助

回答

13

這可以通過讓所有與.oc結尾的名稱的對象的特徵向量,把它們放在一個列表,然後通過do.call調用merge來完成。

# 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對象爲你從API收到他們的列表(objList)會更容易些。那麼你只需要do.call(merge, objList)

+0

據我所知,這裏不需要'x < - y <-z < - 1:10'。 – jbaums 2013-01-24 21:56:48

+0

@jbaums:它們代表全球環境中與預期對象模式不匹配的潛在對象。 – 2013-01-24 22:14:30

+0

啊,這很有道理 - 謝謝。 :) – jbaums 2013-01-24 23:07:53

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

這太好了 - 會試試看。如果我想把從1000行到任意/動態長度的概括爲一個長度,你會建議什麼? – 2011-06-16 23:58:30

+0

@ n.e.w我做的編輯將推廣對象的數量和行數 – wkmor1 2011-06-17 01:23:51