我正在基于xts对象创建比例表.由于这是一个大型程序的一部分(不幸的是)需要大约10 ^ 6个循环,它会产生相当大的瓶颈,我想加快速度. 这是我开始的一个例子: library(quantmod)test.xts - xts
这是我开始的一个例子:
library(quantmod) test.xts <- xts(sample(seq(1,5, by=.5), 50, replace=T), as.Date(1:50)) system.time(for(i in 1:10000){ prop.table(table(test.xts)) }) >user system elapsed 19.86 0.00 18.58
我已经将xts更改为矩阵,这导致了显着的速度增加.我只提到它最初是一个xts,以防我错过了一些xts的东西,这会加速它超出我已经看到的将其转换为矩阵的增益.
test.mat <- as.matrix(test.xts) system.time(for(i in 1:10000){ prop.table(table(test.mat)) }) >user system elapsed 2.78 0.00 2.90
但我真的希望它尽可能快,所以我希望其他人有进一步改进的建议.我希望有一个明显的方法,我忽略了.
另外一条信息是这些表的输出最终与来自不同时间段的类似输出合并,因此维度需要保持命名. (即,我需要能够在时间1匹配’10’值的比例,在时间2匹配’10’的比例).
任何帮助是极大的赞赏.
table()隐式地创建了一个昂贵的因子.在你的情况下,你可以使用tabulate()节省很多(超过10倍),因为你已经有了整数:a <- tabulate(test.mat) names(a) <- seq_along(a) a / sum(a) 1 2 3 4 5 6 7 8 9 10 0.16 0.14 0.08 0.14 0.08 0.16 0.02 0.06 0.10 0.06
定时:
system.time(for(i in 1:10000){ a <- tabulate(test.mat) names(a) <- seq_along(a) a/sum(a) }) user system elapsed 0.208 0.002 0.210
你的比较时机:
system.time(for(i in 1:10000) prop.table(table(test.mat))) user system elapsed 3.373 0.028 3.402