1
我相对比较新data.table
,并希望使用快速子设置功能来执行一些引导程序。data.table子集引导
在我的示例中,我有两列100万个随机法线,我想对某些行取样并计算两列之间的相关性。我希望在data.table网页上建议的速度提高了100倍,但也许我错过了使用data.table
...如果是的话,应该用什么方法来构建函数以便能够得到这个结果速度提升。
请参阅下面我的例子:
n <- 1e6
set.seed(1)
q <- data.frame(a=rnorm(n),b=rnorm(n))
q.dt <- data.table(q)
df.samp <- function(){cor(q[sample(seq(n),n*0.01),])[2,1]}
dt.samp <- function(){q.dt[sample(seq(n),n*0.01),cor(a,b)]}
require(microbenchmark)
microbenchmark(median(sapply(seq(100),function(y){df.samp()})),
median(sapply(seq(100),function(y){dt.samp()})),
times=100)
Unit: milliseconds
expr min lq median uq max neval
median(sapply(seq(100), function(y) { df.samp() })) 1547.5399 1673.1460 1747.0779 1860.3371 2028.6883 100
median(sapply(seq(100), function(y) { dt.samp() })) 583.4724 647.0869 717.7666 764.4481 989.0562 100
我的理论:您正在看到改进采样的效果,但它是在所有样本上运行'cor()'的额外步骤,这是不可缩减的时间瓶颈。 –
你的速度测试有点复杂。也许试试'samp < - sample.int(n,n/100);微基准(Q [SAMP,],q.dt [SAMP])'?我看到data.table子集的速度大约是其两倍。 – Frank