我正在寻找一种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循环更快的功能(即使在并行运行时也是如此)。
非常感谢您的帮助。谢谢!
答案 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
可能会有助于提高性能,但这实际上仍然是一个循环。我怀疑这里是否可以进行进一步的优化。