我有一个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]
。我已经寻求帮助,但我正在努力有效地说出我的要求。
谢谢。
答案 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说的一样:我认为那里有更好的方式...