将每个组与data.table中的每个其他组进行比较

时间:2018-09-21 17:10:37

标签: r loops data.table

我正在寻找一种data.table的方法来潜在地消除double for循环。我正在尝试使用DTW算法将每个组与其他每个组进行比较。

这里是MWE(未优化):

library(data.table)
library(SimilarityMeasures)

tt <- data.table(A=1:100,B=2:101,C=rep(1:4,each=25))
result <- list()
for(i in 1:4){
  for(j in 1:4){
      result[[4*i+j]] <- DTW(tt[C==i,cbind(A,B)],tt[C==j,cbind(A,B)]) 
  }

}
result

A和B是一些用作DTW算法输入的变量,C是分组变量。我试图在.SD中提出一些结合BY或。data.table方法的糟糕解决方案,但失败了。目标是拥有比上述double for循环更快的功能(即使在并行运行时也是如此)。

非常感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

  

我正在寻找一种data.table方法来潜在地消除double for循环。

这是我的建议,而不是for循环和数字索引列表:

s = lapply(split(tt, by="C", keep=FALSE), as.matrix)
f = sum

res = tt[, CJ(C1 = C, C2 = C, unique=TRUE)]
res[, v := f(s[[C1]], s[[C2]]), by=.(C1, C2)]

(我无法安装您的软件包,因此使用一些f而不是DTW。我正在转换为矩阵,因为我认为这就是您使用cbind的原因。)< / p>

通常,枚举组合并使用by=是避免/重新创建带有data.table的循环的一种方法。

预先计算子集矩阵s可能会有助于提高性能,但这实际上仍然是一个循环。我怀疑这里是否可以进行进一步的优化。