是否可以使用data.table在數據集上快速按組應用雙參數函數?在一百萬行的數據集上,我發現調用下面定義的簡單函數超過了11秒,這比我期望的要複雜得多。下面加速查詢R data.table - 這個雙參數函數可以更迅速地按組應用嗎?
自包含的代碼概括了什麼,我試圖做的要領:
# generate data frame - 1 million rows
library(data.table)
set.seed(42)
nn = 1e6
daf = data.frame(aa=sample(1:1000, nn, repl=TRUE),
bb=sample(1:1000, nn, repl=TRUE),
xx=rnorm(nn),
yy=rnorm(nn),
stringsAsFactors=FALSE)
# myfunc is the function to apply to each group
myfunc = function(xx, yy) {
if (max(yy)>1) {
return(mean(xx))
} else {
return(weighted.mean(yy, ifelse(xx>0, 2, 1)))
}
}
# running the function takes around 11.5 seconds
system.time({
dt = data.table(daf, key=c("aa","bb"))
dt = dt[,myfunc(xx, yy), by=c("aa","bb")]
})
head(dt)
# OUTPUT:
# aa bb V1
# 1: 1 2 -1.02605645
# 2: 1 3 -0.49318243
# 3: 1 4 0.02165797
# 4: 1 5 0.40811793
# 5: 1 6 -1.00312393
# 6: 1 7 0.14754417
有沒有一種方法,以減少顯著爲一個函數調用這樣的時候?
我感興趣的是是否有一種更有效的方式來執行上述計算而不完全重寫函數調用,或者是否只能通過分解函數並以某種方式將其重寫爲data.table來加速句法。
非常感謝您的回覆。
你會拿起多一點速度,如果你擺脫ifelse'的'(如'DT3 [,W:= 1] [XX> 0,W:= 2]') – eddi
這是同樣值得注意的是,由於'data.table'優化工作的方式,'dt [,mean(a),by = b]'將比'mymean = function(x)mean(x) ; dt [,mymean(a),by = b]' – eddi