有 2 列data.table
,我想通过对第 2 列中的共享元素数量求和来总结第 1 列中的成对关系。换句话说,X 值的每个成对组合有多少个共享 Y 元素?
例如,我可以通过两步过程来完成此操作,首先进行笛卡尔交叉连接,然后总结如下:
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
; while 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 条件连接
如何根据条件自连接 data.table
关键的区别是我想要总结索引列,这似乎不可能用 by=.EACHI 来完成。