在 xts 上使用 rowSums 时保留 xts 索引
Preserve xts index when using rowSums on xts
有没有办法在传递 rowSums
一个 xts
对象时保留 xts
对象的索引?
目前我将结果重铸为一个 xts
对象,但是这似乎没有 rowSums
能够简单地 return 那样快通过了
xts(rowSums(abs(data)),index(data))
如果您的异议是必须将输入的组件分开并放在一起,那么如果 x
是您的 xts 对象,那么试试这个。它returns直接是一个xts对象:
Reduce("+", as.list(x))
有趣的问题。让我们忽略 abs
计算,因为它在很多时候只与价格无关。如果您关心的是性能,这里是当前建议的一组时间安排:
library(microbenchmark)
sample.xts <- xts(order.by = as.POSIXct("2004-01-01 00:00:00") + 1:1e6, matrix(rnorm(1e6 *4), ncol = 4), dimnames = list(NULL, c("A", "B", "C", "D")))
# See how quickly rowSum works on just the underlying matrix of data in the timings below:
xx <- coredata(sample.xts)
microbenchmark(
coredata(sample.xts),
rowSums(xx),
rowSums(sample.xts),
rowSums(coredata(sample.xts)),
.xts(x = rowSums(sample.xts), .index(sample.xts)),
xts(rowSums(coredata(sample.xts)), index(sample.xts)),
xts(rowSums(sample.xts),index(sample.xts)),
Reduce("+", as.list(sample.xts)), times = 100)
# Unit: milliseconds
# expr min lq mean median uq max neval
# coredata(sample.xts) 2.558479 2.661242 6.884048 2.817607 6.356423 104.57993 100
# rowSums(xx) 10.314719 10.824184 11.872108 11.289788 12.382614 18.39334 100
# rowSums(sample.xts) 10.358009 10.887609 11.814267 11.335977 12.387085 17.16193 100
# rowSums(coredata(sample.xts)) 12.916714 13.839761 18.968731 15.950048 17.836838 113.78552 100
# .xts(x = rowSums(sample.xts), .index(sample.xts)) 14.402382 15.764736 20.307027 17.808984 19.072600 114.24039 100
# xts(rowSums(coredata(sample.xts)), index(sample.xts)) 20.490542 24.183286 34.251031 25.566188 27.900599 125.93967 100
# xts(rowSums(sample.xts), index(sample.xts)) 17.436137 19.087269 25.259143 21.923877 22.805013 119.60638 100
# Reduce("+", as.list(sample.xts)) 21.745574 26.075326 41.696152 27.669601 30.442397 136.38650 100
y = .xts(x = rowSums(sample.xts), .index(sample.xts))
y2 = xts(rowSums(sample.xts),index(sample.xts))
all.equal(y, y2)
#[1] TRUE
coredata(sample.xts)
returns 底层数字矩阵。我认为您可以期望的最快性能是由 rowSums(xx)
给出的计算,可以认为是 "benchmark"。那么问题是,在 xts
对象中最快的方法是什么。它似乎
.xts(x = rowSums(sample.xts), .index(sample.xts))
表现不错。
有没有办法在传递 rowSums
一个 xts
对象时保留 xts
对象的索引?
目前我将结果重铸为一个 xts
对象,但是这似乎没有 rowSums
能够简单地 return 那样快通过了
xts(rowSums(abs(data)),index(data))
如果您的异议是必须将输入的组件分开并放在一起,那么如果 x
是您的 xts 对象,那么试试这个。它returns直接是一个xts对象:
Reduce("+", as.list(x))
有趣的问题。让我们忽略 abs
计算,因为它在很多时候只与价格无关。如果您关心的是性能,这里是当前建议的一组时间安排:
library(microbenchmark)
sample.xts <- xts(order.by = as.POSIXct("2004-01-01 00:00:00") + 1:1e6, matrix(rnorm(1e6 *4), ncol = 4), dimnames = list(NULL, c("A", "B", "C", "D")))
# See how quickly rowSum works on just the underlying matrix of data in the timings below:
xx <- coredata(sample.xts)
microbenchmark(
coredata(sample.xts),
rowSums(xx),
rowSums(sample.xts),
rowSums(coredata(sample.xts)),
.xts(x = rowSums(sample.xts), .index(sample.xts)),
xts(rowSums(coredata(sample.xts)), index(sample.xts)),
xts(rowSums(sample.xts),index(sample.xts)),
Reduce("+", as.list(sample.xts)), times = 100)
# Unit: milliseconds
# expr min lq mean median uq max neval
# coredata(sample.xts) 2.558479 2.661242 6.884048 2.817607 6.356423 104.57993 100
# rowSums(xx) 10.314719 10.824184 11.872108 11.289788 12.382614 18.39334 100
# rowSums(sample.xts) 10.358009 10.887609 11.814267 11.335977 12.387085 17.16193 100
# rowSums(coredata(sample.xts)) 12.916714 13.839761 18.968731 15.950048 17.836838 113.78552 100
# .xts(x = rowSums(sample.xts), .index(sample.xts)) 14.402382 15.764736 20.307027 17.808984 19.072600 114.24039 100
# xts(rowSums(coredata(sample.xts)), index(sample.xts)) 20.490542 24.183286 34.251031 25.566188 27.900599 125.93967 100
# xts(rowSums(sample.xts), index(sample.xts)) 17.436137 19.087269 25.259143 21.923877 22.805013 119.60638 100
# Reduce("+", as.list(sample.xts)) 21.745574 26.075326 41.696152 27.669601 30.442397 136.38650 100
y = .xts(x = rowSums(sample.xts), .index(sample.xts))
y2 = xts(rowSums(sample.xts),index(sample.xts))
all.equal(y, y2)
#[1] TRUE
coredata(sample.xts)
returns 底层数字矩阵。我认为您可以期望的最快性能是由 rowSums(xx)
给出的计算,可以认为是 "benchmark"。那么问题是,在 xts
对象中最快的方法是什么。它似乎
.xts(x = rowSums(sample.xts), .index(sample.xts))
表现不错。