如何将 do.call 和 cbind 与循环中的对象列表一起使用?
How to use do.call and cbind with a list of objects in a loop?
我使用 do.call
和 cbind
将几个 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"
。
如果我告诉 list
将 o
作为带有 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 中通常是一种缓慢、低效的处理方式。
我使用 do.call
和 cbind
将几个 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"
。
如果我告诉 list
将 o
作为带有 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 中通常是一种缓慢、低效的处理方式。