使用矩阵引用xts对象

时间:2014-11-15 18:52:14

标签: r matrix xts

我有一个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(来自第二排温度的元素6,5,7)

我的第一次尝试是temp[,ac.topn]。我已经寻求帮助,但我正在努力有效地说出我的要求。

谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以使用数字矩阵索引来对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说的一样:我认为那里有更好的方式...