每行的data.table函数太慢了

Chr*_*ris 5 r data.table

我需要计算每行的加权平均值(6M +行),但这需要很长时间.带权重的列是字符字段,因此加权.不能直接使用.

后台数据:

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)
}
Run Code Online (Sandbox Code Playgroud)

以下是使用data.frames完成(太慢)的方法:

DF$wm <- mapply(string.weighted.mean, DF$weights)
Run Code Online (Sandbox Code Playgroud)

这样做的工作太慢了(几个小时):

DT[, wm:=mapply(string.weighted.mean, weights)]
Run Code Online (Sandbox Code Playgroud)

如何改写最后一行来加快速度?

Mic*_*ael 6

DT[, rowid := 1:nrow(DT)]
setkey(DT, rowid)
DT[, wm :={
    weighted.mean(x=values, w=na.omit(as.numeric(unlist(str_split(string=weights, pattern="[^0-9]+")))))     
}, by=rowid]
Run Code Online (Sandbox Code Playgroud)