Ho bisogno di calcolare medie ponderate per riga (6M + righe), ma ci vuole molto tempo. La colonna con pesi è un campo carattere, quindi non può essere utilizzato direttamente. Datidata.table funzione per riga troppo lenta
Background:
library(data.table)
library(stringr)
values <- c(1,2,3,4)
grp <- c("a", "a", "b", "b")
weights <- c("{10,0,0,0}", "{0,10,0,0}", "{10,10,0,0}", "{0,0,10,0}")
DF <- data.frame(cbind(grp, weights))
DT <- data.table(DF)
string.weighted.mean <- function(weights.x) {
tmp.1 <- na.omit(as.numeric(unlist(str_split(string=weights.x, pattern="[^0-9]+"))))
tmp.2 <- weighted.mean(x=values, w=tmp.1)
}
Ecco come si può fare (troppo lento) con data.frames:
DF$wm <- mapply(string.weighted.mean, DF$weights)
Questo fa il lavoro, ma è troppo lento (ore):
DT[, wm:=mapply(string.weighted.mean, weights)]
Come può essere riformulata l'ultima riga per accelerare le cose?
Hai un'ottima risposta. Solo per aggiungere: faccio fatica a pensare a un formato di input peggiore. Se possibile, utilizza le colonne dell'elenco per memorizzare i pesi come vettori numerici e per l'efficienza mai _ever_ iterate per riga, sempre per colonna. E una matrice potrebbe essere migliore in compiti come questo di data.table. –