在data.table中复制SQL Join + Group By

时间:2015-04-17 02:18:44

标签: sql r data.table

我正在尝试使用数据表复制SQL稀疏矩阵乘法。 SQL表达式为:

SELECT a.i, b.j, SUM(a.value*b.value)
FROM a, b
WHERE a.j = b.i
GROUP BY a.i, b.j;

我的数据在每个表中的结构为| i | j |值

要在R中创建此数据,您可以使用:

library(reshape2)
library(data.table)

A <- matrix(runif(25),5,5)
B <- matrix(runif(25),5,5)

ADT <- data.table(melt(A))
BDT <- data.table(melt(B))

setnames(ADT,old = c("Var1","Var2","value"), new = c("Ai","Aj","AVal"))
setnames(BDT,old = c("Var1","Var2","value"), new = c("Bi","Bj","BVal"))

要合并使用。[我们需要设置我们加入的键:

setkey(ADT,"Aj")
setkey(BDT,"Bi")

逐件建立

ADT[BDT, allow.cartesian = T]

     Ai Aj       AVal Bj      BVal
  1:  1  1 0.39230905  1 0.7083956
  2:  2  1 0.89523490  1 0.7083956
  3:  3  1 0.92464689  1 0.7083956
  4:  4  1 0.15127499  1 0.7083956
  5:  5  1 0.88838458  1 0.7083956
 ---                              
121:  1  5 0.70144360  5 0.7924433
122:  2  5 0.50409075  5 0.7924433
123:  3  5 0.15693879  5 0.7924433
124:  4  5 0.09164371  5 0.7924433
125:  5  5 0.63787487  5 0.7924433

到目前为止一切顺利。合并工作正常,Bi已经消失,但无论如何都由Aj编码。我们现在想要将AVal乘以BVal,然后对创建的组求和(!在同一个表达式中,我知道我可以在这里存储和应用第二个表达式)。我以为这会是:

ADT[BDT, j = list(Ai, Bj, Value = sum(AVal*BVal)), by = c("Ai","Bj") , allow.cartesian = T]

但我收到错误:Object Bj not found。实际上,一旦我插入by =子句,尝试系统地从上面的表达式中删除BjBVal"Bj",“BDT”中的值都不可用。从左到右,你会看到我的意思。)

查看.EACHI表达式,似乎动机就是按照我的意愿行事,但合并索引上的.EACHI组,而不是单独的变量。

1 个答案:

答案 0 :(得分:1)

听起来你只想在合并后聚合:

ADT[BDT, allow.cartesian = T][, sum(AVal * BVal), by = .(Ai, Bj)]