我需要計算每行加權平均值(6M +行),但這需要很長時間。帶有權重的列是一個字符字段,因此加權。不能直接使用。每行data.table函數太慢
背景資料:
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)
}
這裏是如何可以做到(太慢)與data.frames:
DF$wm <- mapply(string.weighted.mean, DF$weights)
這做這項工作,但是太慢(小時):
DT[, wm:=mapply(string.weighted.mean, weights)]
如何修改最後一行來加快速度?
你有一個很好的答案。只是補充一點:我很難想出更糟糕的輸入格式。如果可能的話,使用列表將權重存儲爲數字向量,效率永遠不會按行迭代,總是按列迭代。矩陣可能比data.table更適合這樣的任務。 –