Сравните каждую группу с любой другой группой в data.table - PullRequest
0 голосов
/ 21 сентября 2018

Я ищу 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 является переменной группировки.Я попытался придумать какое-нибудь удачное решение в сочетании с подходом .SD или. BY в data.table, но не получилось.Цель состоит в том, чтобы иметь намного более быструю функцию, чем вышеуказанный двойной цикл for (даже при параллельном запуске).

Любая помощь очень ценится.Спасибо!

1 Ответ

0 голосов
/ 21 сентября 2018

Я ищу data.table способ потенциально устранить двойной цикл 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.)

Как правило, перечисление комбинаций и использование by= - это способ избежать / переформулировать цикл с данными.Таблица.

Предварительный расчет подмножеств матриц s может помочь с производительностью, но это по сути все еще цикл.Я сомневаюсь, что здесь можно сделать гораздо большую оптимизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...