Суммируйте индекс самосоединения, избегая декартового произведения в 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.