data.tableを使用して、2つのパラメータの関数をデータセット全体でグループ単位で素早く適用できますか? 100万行のデータセットでは、以下に定義されている単純な関数を呼び出すのが11秒以上かかることがわかりました。これは、この複雑さの何かに対して予想されるよりもはるかに長くなります。R data.tableの高速化クエリ - この2つの引数の関数をグループ単位でより迅速に適用できますか?
以下の自己完結型のコードでは、私が何をしようとしています何の要点を概説:
# 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構文。
返信いただきありがとうございます。
あなたはもう少しスピードアップをピックアップします(例えば、' DT3 [:= 1、W] [wは、xx>は0:= 2] ') – eddi
イッツ'dt [、mean(a)、by = b]'は 'mymean = function(x)mean(x)よりもかなり速くなるでしょう。 ; dt [、mymean(a)、by = b] ' – eddi