2015-05-26 25 views
2

我使用do.callcbind將幾個xts對象組裝成更通用的容器data。我的目標是實現一個循環,用於直接通過矢量名稱添加對象。如何將do.call和cbind與循環中的對象列表一起使用?

這裏原來do.call

data <- do.call(cbind, c(eapply(e, Cl), 

          list(A), 
          list(B), 
          list(C), 
          list(D) 
)) 

解釋包含XTS目的和data也是XTS對象。

> str(A) 
An ‘xts’ object on 2014-01-02/2015-05-25 containing: 
    Data: num [1:360, 1] 100 98.9 98.5 98.4 98.7 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr "A" 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
NULL 

當我定義與與XTS對象的名稱向量:

objects <- c(

    "A", 
    "B", 
    "C", 
    "D" 
) 

,然後試圖通過他們做一個循環,R logicaly處理矢量字符,只有最後一個條目被添加,在這裏"D"

如果我告訴list處理o作爲XTS對象與as.xts,R返回一個錯誤,說有對階級性的對象as.xts沒有適用的方法。我的理解是,as.xts必須用於像data.frame這樣的多維數據,這在這裏是不合適的。

for (o in objects){ 

    data <- do.call(cbind, c(eapply(e, Cl), list(as.xts(o)))) 

} 

我不想從頭開始創建新的XTS對象與xts怎麼能告訴listo是一個對象,而不是一個字符串?還是應該使用完全不同的方法?

+0

見'GET'緩慢,低效的方式?我想'as.xts(get(o))'是你正在尋找的。 – nicola

+0

很高興知道。謝謝。它添加了最後一個條目,這裏'D'在容器內,但由於某種原因'do.call'不會追加這些對象。我需要首先把所有的對象放在一個列表中,然後'do.call'? – Florent

回答

3

還有mget - '多得' 我承擔。所以,你可以這樣做:

do.call(cbind, mget(objects)) 

這避免了需要必須建立由一個一步一步數據幀,這通常是在R.做事

+0

我正在嘗試'mget',但是在循環內部..現在它工作得很好。謝謝。 – Florent

0

正如Nicola在評論部分中提到的那樣,get命令通過按名稱搜索對象來完成這項工作。這裏有兩個解決方案:第一步do.callcbind將對象列表附加在一起,然後第二個cbind附加在data中。

for (o in objects){ 

    s <- as.xts(get(o)) 
    temp <- do.call(cbind, c(list(s))) 
    data <- cbind(data, temp) 

} 
+0

'mget'在這裏效率更高,擺脫了你對循環的需求。看到我的回答 – thelatemail

相關問題