Суммируйте индекс самосоединения, избегая декартового произведения в R data.table

С 2 колонкамиdata.tableЯ хотел бы суммировать парные отношения в столбце 1 путем суммирования количества общих элементов в столбце 2. Другими словами, сколько общих элементов Y имеет каждая попарная комбинация значений X?

Например, я могу сделать это в два этапа: сначала сделать декартово перекрестное соединение, а затем подытожить его следующим образом:

d = data.table(X=c(1,1,1,2,2,2,2,3,3,3,4,4), Y=c(1,2,3,1,2,3,4,1,5,6,4,5))
setkey(d, Y)
d2 = d[d, allow.cartesian=TRUE]
d2[, .N, by=c("X", "i.X")]
 #  X i.X N
 #1: 1   1 3
 #2: 2   1 3
 #3: 3   1 1
 #4: 1   2 3
 #5: 2   2 4
 #6: 3   2 1
 #7: 1   3 1
 #8: 2   3 1
 #9: 3   3 3
#10: 4   2 1
#11: 2   4 1
#12: 4   4 2
#13: 4   3 1
#14: 3   4 1

Вторая строка этого результата указывает, чтоX=1 делит 3 значения Y сX=2; в то время какX=3 делит только 1 y-значение сX=4.

Есть ли способ сделать это, минуя шаг декартового объединения, который приводит к большим неэффективным таблицам? Я хочу сделать что-то вроде этого на столе с миллионами строк, и декартово объединение сталкивается с2^31 ограничение размера вектора (в дополнение к замедлению).

Я представляю что-то вроде этого:

d[d, list(X, length(Y)), by=c("X", "i.X")]

Но это дает ошибкуi.X not found

Я могу сделать это в SQL с помощью приведенного ниже кода, но просто не могу понять, как перевести это в синтаксис data.table:

CREATE TABLE test (X integer, Y integer);
INSERT INTO test VALUES(1, 1);
INSERT INTO test VALUES(1, 2);
INSERT INTO test VALUES(1, 3);
INSERT INTO test VALUES(2, 1);
INSERT INTO test VALUES(2, 2);
INSERT INTO test VALUES(2, 3);
INSERT INTO test VALUES(2, 4);
INSERT INTO test VALUES(3, 1);
INSERT INTO test VALUES(3, 5);
INSERT INTO test VALUES(3, 6);
INSERT INTO test VALUES(4, 4);
INSERT INTO test VALUES(4, 5);

SELECT A.X, B.X, COUNT(A.Y) as N FROM test as A JOIN test as B WHERE A.Y==B.Y GROUP BY A.X, B.X;

Дело в том, что столбец, который я хочу обобщить, совпадает с столбцом, к которому я присоединяюсь. Этот вопрос похож на эти, но не совсем:

R Data.Table Join на условных выражениях

Как самостоятельно присоединиться к data.table при условии

Главное отличие в том, что я хочусуммировать индекс столбцачто кажется невозможным сделать с помощью = .EACHI.

Ответы на вопрос(0)

Ваш ответ на вопрос