Summarize der Self-Join-Index unter Vermeidung von kartesischen Produkt in R data.table

Mit einer 2-spaltigendata.table, Ich möchte die paarweisen Beziehungen in Spalte 1 zusammenfassen, indem ich die Anzahl der gemeinsamen Elemente in Spalte 2 summiere. Mit anderen Worten, wie viele gemeinsame Y-Elemente hat jede paarweise Kombination von X-Werten?

Zum Beispiel kann ich dies in einem zweistufigen Prozess tun, indem ich zuerst einen kartesischen Cross-Join durchführe und ihn dann wie folgt zusammenfasse:

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

Die zweite Zeile dieses Ergebnisses zeigt an, dassX=1 teilt 3 Y-Werte mitX=2; währendX=3 teilt nur 1 y-Wert mitX=4.

Gibt es eine Möglichkeit, dies unter Umgehung des kartesischen Verknüpfungsschritts zu tun, was zu großen ineffizienten Tabellen führt? Ich möchte so etwas für eine Tabelle mit Millionen von Zeilen tun, und die kartesische Verknüpfung wird in das @ ausgeführ2^31 Vektorgrößenbegrenzung (zusätzlich zu langsam werden).

Ich stelle mir so etwas vor:

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

Aber dies gibt den Fehleri.X not found

Ich kann dies in SQL mit dem folgenden Code tun - kann aber nur nicht herausfinden, wie dies in die data.table-Syntax übersetzt wird:

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;

Der Punkt ist, dass die Spalte, die ich zusammenfassen möchte, mit der Spalte übereinstimmt, der ich beitrete. Diese Frage ist ähnlich, aber nicht genau:

R Data.Table Join bei Bedingungen

Wie kann ich einer data.table unter einer Bedingung selbst beitreten?

Der Hauptunterschied ist, dass ich @ wollsummarize die Indexspalte, was unmöglich zu tun scheint mit = .EACHI.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage