Ich muss gewichtete Mittel pro Zeile (6M + Zeilen) berechnen, aber es dauert sehr lange Zeit. Die Spalte mit Gewichten ist ein Zeichenfeld, also kann gewichtet werden.kann nicht direkt verwendet werden.data.table Funktion pro Zeile zu langsam
Hintergrunddaten:
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)
}
Hier ist, wie es (zu langsam) mit data.frames getan werden kann:
DF$wm <- mapply(string.weighted.mean, DF$weights)
den Job Dies tut aber ist viel zu langsam (Stunden):
DT[, wm:=mapply(string.weighted.mean, weights)]
Wie kann die letzte Zeile umformuliert werden, um die Dinge zu beschleunigen?
Sie haben eine gute Antwort. Nur um hinzuzufügen: Ich habe Mühe, an ein schlechteres Eingabeformat zu denken. Wenn möglich, verwenden Sie Listenspalten, um die Gewichtungen als numerische Vektoren zu speichern, und für Effizienz nie _ever_ iterieren nach Zeile, immer nach Spalte. Und eine Matrix mag bei solchen Aufgaben besser sein als data.table. –