【发布时间】:2020-05-30 22:22:21
【问题描述】:
我有一个xts 对象,我希望创建列的加权总和(并且这样做LOT)。到目前为止,最简单的方法是矩阵乘法,但结果失去了良好的xts 品质。
通过创建一个新的xts 对象很容易将它们添加回来——但这既慢又乏味。
例如:
dd <- xts(matrix(rnorm(200), ncol=2), Sys.Date() + 1:100)
w_sum <- dd %*% c(-1, 1)
...问题是:
> tail(w_sum)
[,1]
[95,] 0.1758262
[96,] -0.3310975
[97,] -0.1204836
[98,] -1.2242001
[99,] -1.7333222
[100,] 1.1216603
解决方法是:
w_sumx <- xts(dd %*% c(-1, 1), index(dd))
但这不仅麻烦,而且速度很慢。另外,我感兴趣地注意到xts 的减法速度非常快。有没有办法利用xts 的快速内部结构来做到这一点?
f1 <- function() xts(dd %*% c(-1, 1), index(dd))
f2 <- function() dd[,2] - dd[,1]
> microbenchmark::microbenchmark(f1(), f2(), times = 1000)
Unit: microseconds
expr min lq mean median uq max neval cld
f1() 83.7 97.3 114.1294 104.65 115.00 6688.4 1000 b
f2() 26.3 34.0 40.6202 38.85 45.15 155.4 1000 a
【问题讨论】:
-
将
w_sum保留为dd中的列是否可行?如果是这样,dd$w_sum <- dd %*% c(-1, 1)可能是最快的(尽管您需要dd的命名列才能使其工作,您的示例中没有,但可能在现实生活中)。 -
这样设置是可能的——但我希望它不这样做也能正常工作。我突然想到,我可以重载 %*% 并使用 Rcpp 使其快速......尽管这看起来像是一把大锤
-
w_sum <- Reduce("+", as.list(dd * rep(c(-1, 1), each = nrow(dd))))比f1快一点 - 出于某种原因,它设法保留了xts类。 -
这似乎更快。
replace(dd[, 1], 1:nrow(dd), dd %*% c(-1, 1))