Resuma o índice de auto-junção, evitando o produto cartesiano em R data.table

Com duas colunasdata.table, Gostaria de resumir os relacionamentos em pares na coluna 1, somando o número de elementos compartilhados na coluna 2. Em outras palavras, quantos elementos Y compartilhados cada combinação em pares de valores X possui?

Por exemplo, eu posso fazer isso em um processo de duas etapas, primeiro fazendo uma junção cruzada cartesiana e depois resumindo da seguinte forma:

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

A segunda linha deste resultado indica queX=1 compartilha 3 valores Y comX=2; enquantoX=3 compartilha apenas um valor y comX=4.

Existe alguma maneira de fazer isso ignorando a etapa de junção cartesiana, o que leva a grandes tabelas ineficientes? Eu quero fazer algo assim em uma tabela com milhões de linhas, e a junção cartesiana é executada no2^31 limite de tamanho do vetor (além de ficar lento).

Estou imaginando algo assim:

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

Mas isso dá o erroi.X not found

Eu posso fazer isso no SQL com o código abaixo - mas não consigo descobrir como traduzir isso na sintaxe 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;

O ponto é que a coluna que eu quero resumir é a mesma que eu estou ingressando. Esta pergunta é semelhante a estas, mas não exatamente:

R Data.Table Join em condicionais

Como ingressar automaticamente em um data.table em uma condição

A principal diferença é que eu queroresumir a coluna do índice, o que parece impossível de ser feito com = .EACHI.

questionAnswers(3)

yourAnswerToTheQuestion