我需要计算每行的加权平均值(6M+ 行),但这需要很长时间。带权重的列是字符域,所以不能直接使用 weighted.mean。
后台数据:
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)]
如何改写最后一行以加快速度?