我正在尝试使用数据表复制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 =
子句,尝试系统地从上面的表达式中删除Bj
,BVal
和"Bj"
,“BDT”中的值都不可用。从左到右,你会看到我的意思。)
查看.EACHI
表达式,似乎动机就是按照我的意愿行事,但合并索引上的.EACHI
组,而不是单独的变量。
答案 0 :(得分:1)
听起来你只想在合并后聚合:
ADT[BDT, allow.cartesian = T][, sum(AVal * BVal), by = .(Ai, Bj)]