用于引导的data.table子集

时间:2013-08-28 15:44:34

标签: r 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

1 个答案:

答案 0 :(得分:1)

除了@Ddin的评论:

如果您对代码进行了分析,您会发现代价最高的重复函数调用是seq(最多只需要一次)和sample

Rprof()
median(sapply(seq(2000), function(y) {     dt.samp() }))
Rprof(NULL)

summaryRprof()

# $by.self
#                    self.time self.pct total.time total.pct
# "seq.default"           3.70    35.10       3.70     35.10
# "sample.int"            2.84    26.94       2.84     26.94
# "[.data.table"          1.84    17.46      10.52     99.81
# "sample"                0.34     3.23       6.90     65.46
# "[[.data.frame"         0.16     1.52       0.34      3.23
# "length"                0.14     1.33       0.14      1.33
# "cor"                   0.10     0.95       0.26      2.47
#<snip>

更快的子集对此没有帮助。