Я пытаюсь заменить декартово произведение, созданное SQL, на вызов data.table. У меня большая история с активами и ценностями, и мне нужно подмножество всех комбинаций. Скажем, что у меня есть таблица a с T = [дата, контракт, значение]. В SQL это выглядит как
SELECT a.date, a.contract, a.value, b.contract. b.value
FROM T a, T b
WHERE a.date = b.date AND a.contract <> b.contract AND a.value + b.value < 4
В R у меня теперь есть
library(data.table)
n <- 1500
dt <- data.table(date = rep(seq(Sys.Date() - n+1, Sys.Date(), by = "1 day"), 3),
contract = c(rep("a", n), rep("b", n), rep("c", n)),
value = c(rep(1, n), rep(2, n), rep(3, n)))
setkey(dt, date)
dt[dt, allow.cartesian = TRUE][(contract != i.contract) & (value + i.value < 4)]
Я считаю, что мое решение сначала создает все комбинации (в данном случае 13 500 строк), а затем фильтрует (до 3000). Однако SQL (и, возможно, я ошибаюсь), присоединяется к подмножеству, и, что более важно, не загружайте все комбинации в ОЗУ. Любые идеи о том, как использовать data.table более эффективно?