Est-il possible d'utiliser data.table pour appliquer une fonction à deux paramètres rapidement par groupe dans un ensemble de données? Sur un ensemble de données de 1 million de lignes, je trouve qu'appeler la fonction simple définie ci-dessous prend plus de 11 secondes, ce qui est beaucoup plus long que ce à quoi je m'attendais pour quelque chose de cette complexité.Demande d'accélération pour R data.table - cette fonction à deux arguments peut-elle être appliquée par groupe plus rapidement?
Le code autonome ci-dessous présente l'essentiel de ce que je suis en train de faire:
# 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
Est-il possible de réduire considérablement le temps d'un appel de fonction comme celui-ci? Je souhaiterais savoir s'il existe un moyen plus efficace d'effectuer le calcul ci-dessus sans réécrire complètement l'appel de fonction, ou s'il ne peut être accéléré qu'en décomposant la fonction et en la réécrivant en quelque sorte dans data.table syntaxe.
Un grand merci d'avance pour vos réponses.
vous prenez un peu plus de vitesse si vous vous débarrasser de 'ifelse' (par exemple' DT3 [w: = 1] [xx> 0, w: = 2] ') – eddi
Il est Il est également important de noter qu'en raison de la façon dont les optimisations de 'data.table' fonctionnent,' dt [, mean (a), by = b] 'va être significativement plus rapide que' mymean = function (x) mean (x) ; dt [, mymean (a), par = b] ' – eddi