[英]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.