如何在循环中使用do.call和cbind以及对象列表?

时间:2015-05-26 21:21:15

标签: r xts

我使用do.callcbind将几个xts对象组合到一个更通用的容器data中。我的目标是实现一个循环,用于直接通过向量添加对象的名称。

以下是原始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逻辑上将矢量作为字符处理,并且仅添加最后一个条目,此处为"D"

如果我告诉listo作为带有as.xts的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对象,那么如何告诉list o是一个对象而不是一个字符串?或者我应该使用完全不同的方法?

2 个答案:

答案 0 :(得分:3)

我还假设mget - '多次获得'。所以你可以这样做:

do.call(cbind, mget(objects) )

这避免了必须逐步构建数据帧的需要,这通常是在R中执行操作的缓慢,低效的方式。

答案 1 :(得分:0)

正如Nicola在评论部分提到的那样,get命令通过按名称搜索对象来完成这项工作。以下是两个步骤中的一个解决方案:首先do.call cbind将对象列表附加在一起,然后第二个cbind追加data中的所有对象。

for (o in objects){

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

}