【问题标题】:Merge two xts objects (matrices) into a single array in R将两个 xts 对象(矩阵)合并到 R 中的单个数组中
【发布时间】:2011-04-18 00:55:12
【问题描述】:

我有两个 xts 对象。

> require(quantmod)

> getSymbols("GLD;SLV")
[1] "GLD" "SLV"

> head(SLV, n=2)
           SLV.Open SLV.High SLV.Low SLV.Close SLV.Volume SLV.Adjusted
2007-01-03   129.96   131.16  124.70    125.58    7480000        12.56
2007-01-04   126.04   127.97  125.45    125.80    3220000        12.58

> head(GLD, n=2)
           GLD.Open GLD.High GLD.Low GLD.Close GLD.Volume GLD.Adjusted
2007-01-03    63.58    64.02   62.00     62.28    8061900        62.28
2007-01-04    62.07    62.50   61.52     61.65    4858600        61.65

> NROW(SLV) == NROW(GLD)
[1] TRUE

如何将这些单独的二维矩阵“堆叠”成单个 3 维数组?

大致如下:

metal <- xts_stacking_function (GLD, SLV)

class(metal)
[1] "array"

metal[1,,1]
              GLD.Open GLD.High GLD.Low GLD.Close GLD.Volume GLD.Adjusted
2007-01-03    63.58    64.02      62     62.28    8061900        62.28

【问题讨论】:

  • 首先,GLD 和 SLV 不是数组,它们是 xts 对象。其次,这里的 3D 数组是什么意思?如果您希望他们共享索引,请尝试 newvar
  • 你能提供一个你想要的输出示例吗?
  • @bill merge(SLV, GLD) 将返回一个二维的 xts 对象,而不是我要查找的数组对象。
  • @Milktrader:它必须是一个数组吗? xts 对象列表会起作用吗?如果您描述更多您正在尝试做的事情,也许我们可以创建一个解决方案。
  • @Joshua,我考虑使用 xts 对象列表而不是数组,并认为数组可能会更简单,但我正在重新考虑这种方法。我的最终目标是组织交易系统的一大组排列,每个排列都有其相关的交易信号和回报,然后轻松地对整个“空间”进行计算。我会多考虑一下,也许会提出一个更好的问题。

标签: arrays r merge xts


【解决方案1】:

我认为 xts 对象不支持 3d 数组。您可能需要一个丑陋的解决方案,如下所示。将所有内容放入数组中会将事物强制转换为数值。但至少这保留了日期索引,尽管格式不同,因为数组只能有一种数据类型。

require(quantmod)
getSymbols("GLD;SLV")
GLD <- cbind(index(GLD), as.matrix(GLD))
SLV <- cbind(index(SLV), as.matrix(SLV))
C <- array(,c(dim(GLD),2))
C[,,1] <- GLD
C[,,2] <- SLV

【讨论】:

  • 它似乎正在删除日期,这对我的目的很重要。如果你愿意,我会在上面添加更多代码,以便你可以复制它。
  • 查看我的编辑。恐怕这里不会有一个真正干净的解决方案。希望其他人可以加入一些更好的东西。
  • 恐怕你是对的,没有办法从 xts 对象创建数组。我希望数组能够放弃对 xts 和 zoo 对象的单一数据类型规则,因为这正是矩阵所做的。本质上,xts 对象是一个以时间为索引的矩阵,不是吗?
  • @Milktrader:是的 xts/zoo 对象只是一个具有“索引”属性的矩阵。
【解决方案2】:

鉴于您的最新评论,我认为您可以通过以下两种方式之一做您想做的事:

  1. lapply 与 xts 对象列表一起使用
  2. eapply 与存储在自己环境中的xts 对象一起使用

#2 使用 getSymbols 的示例(注意 eapply 返回一个列表):

library(quantmod)
myEnv <- new.env()
getSymbols("GLD;SLV", env=myEnv)
eapply(myEnv, function(x) head(Cl(x),3))
# $SLV
#            SLV.Close
# 2007-01-03    125.58
# 2007-01-04    125.80
# 2007-01-05    121.80
# 
# $GLD
#            GLD.Close
# 2007-01-03     62.28
# 2007-01-04     61.65
# 2007-01-05     60.17

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 2014-07-21
    • 2021-08-17
    • 2012-08-19
    • 2011-09-17
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    相关资源
    最近更新 更多