簡體   English   中英

用於引導的data.table子設置

[英]data.table subsetting for bootstrapping

我對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

除了@DWin的評論:

如果對代碼進行概要分析,您會發現最昂貴的重復函數調用是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>

更快的子集無助於此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM