如何将 do.call 和 cbind 与循环中的对象列表一起使用?

How to use do.call and cbind with a list of objects in a loop?

我使用 do.callcbind 将几个 xts 对象 assemble 放入一个更通用的容器 data 中。我的 objective 是实现一个循环,用于直接通过矢量中的名称添加对象。

这里是原文 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 returns 会出现一个错误,指出 [=42= 没有适用的方法] 在 class 字符的对象上。我的理解是as.xts必须用在像data.frame这样的多维上,这里不合适。

for (o in objects){

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

}

我不想用 xts 从头开始​​创建新的 xts 对象,所以如何告诉 list o 是一个对象而不是一个字符串?还是我应该使用完全不同的方法?

正如 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)

}

我想还有 mget - 'multiple get'。所以你可以这样做:

do.call(cbind, mget(objects) )

这避免了必须逐步构建数据框的需要,这在 R 中通常是一种缓慢、低效的处理方式。