我使用do.call
和cbind
将几个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"
。
如果我告诉list
将o
作为带有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
是一个对象而不是一个字符串?或者我应该使用完全不同的方法?
答案 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)
}