【问题标题】:Compare every group with every other group in data.table将每个组与 data.table 中的每个其他组进行比较
【发布时间】:2019-02-26 03:14:00
【问题描述】:

我正在寻找一种data.table 方法来潜在地消除双 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是分组变量。我试图在data.table 中提出一些结合.SD 或.BY 方法的lapply 解决方案,但失败了。目标是拥有比上述双 for 循环更快的函数(即使在并行运行时)。

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: r loops data.table


    【解决方案1】:

    我正在寻找一种可能消除双 for 循环的 data.table 方法。

    这是我的建议,而不是 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 的原因。)

    一般来说,枚举组合和使用by= 是一种避免/重新构造 data.table 循环的方法。

    预计算子集矩阵s 可能有助于提高性能,但这本质上仍然是一个循环。我怀疑这里可以进行更多的优化。

    【讨论】:

    • 谢谢弗兰克。这是一个有趣的方法。不幸的是,它实际上或多或少和我原来的帖子一样快(甚至有点慢)。还有其他想法吗?
    • @PukiLuki 好的,很高兴知道。 (我真的没有任何进一步的想法,但是......)我建议查找如何使用 R 的内置“分析”工具。他们可以告诉你大部分时间占用了什么。如果结果是 DTW(),那么如果您需要计算所有比较,我想没有太大的改进空间。如果结果是其他东西,那么您可以考虑简化这部分代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多