1

我相对较新,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
4

1 回答 1

1

除了@DWin 的评论:

如果您分析您的代码,您会发现最昂贵的重复函数调用是那些 to 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>

更快的子集化对此无济于事。

于 2013-08-28T16:14:04.403 回答