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.