【问题标题】:referencing an xts object with a matrix使用矩阵引用 xts 对象
【发布时间】:2014-11-15 18:52:13
【问题描述】:

我有一个 207x7 xts 对象(称为 temp)。我有一个 207x3 矩阵(称为 ac.topn),其中的每一行都包含我想要的 xts 对象中相应行的列。

例如,给定以下前两行 temp 和 ac.topn,

temp
             v1   v2    v3  v4  v5    v6   v7
1997-09-30 14.5  8.7  -5.8 2.6 4.7   1.9 17.2
1997-10-31  6.0 -2.0 -25.7 2.9 4.9   9.6  8.4

head(ac.topn)
           Rank1 Rank2 Rank3
1997-09-30     7     4     2
1997-10-31     6     5     7

我想得到结果: 1997-09-30 17.2 2.6 8.7(temp 第一行中的元素 7、4 和 2) 1997-10-31 9.6 4.9 8.4(temp第二行的元素6、5、7)

我的第一次尝试是temp[,ac.topn]。我已经浏览过帮助,但很难有效地表达我的请求。

谢谢。

【问题讨论】:

  • 以后,请使用{} 按钮发布代码或结果。
  • 即使您可以通过矩阵对 xts 对象进行子集化,您的尝试也不会奏效,因为 ?Extract 中的这段话:“当通过 [ 索引数组时,单个参数 i 可以是一个矩阵,其列数与x 的维数一样多;结果是一个向量,其元素对应于i 的每一行中的索引集。"

标签: r matrix xts


【解决方案1】:

嗯,这行得通,但我不得不认为有更好的方法......

result <- do.call(rbind,lapply(index(temp),function(i)temp[i,ac.topn[i]]))
colnames(result) <- colnames(as.topn)
result
#            Rank1 Rank2 Rank3
# 1997-09-30  17.2   2.6   8.7
# 1997-10-31   9.6   4.9   8.4

【讨论】:

  • 我无法得到这个答案,但它让我想到了可以做 t(sapply(seq(1,n),function(i) ac.ret[i,ac.topn[i,]])) 的东西,其中 n 是行数。我认为我的问题是 index(temp) 是一个日期,而不是一个整数序列。
  • 这个答案假定tempac.topn 都是xts 对象。如果没有,请使用ac.topn &lt;- as.xts(ac.topn)。如果tempac.topn 没有相同顺序的相同行,使用整数索引会产生很大的问题。
【解决方案2】:

您可以通过数字矩阵使用索引来子集xts 对象的矩阵版本:

m <- as.matrix(temp)
cols <- as.vector(ac.topn)
rows <- rep(1:nrow(ac.topn), ncol(ac.topn))

vals <- m[cbind(rows, cols)]
xts(x = matrix(vals, nrow = nrow(temp)), order.by = index(temp))
#            [,1] [,2] [,3]
# 1997-09-30 17.2  2.6  8.7
# 1997-10-31  9.6  4.9  8.4

但是,我和@jlhoward 说的一样:我必须认为有更好的方法......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多