data.table矩阵乘法 - 笛卡儿乘积

时间:2015-11-27 23:08:29

标签: r data.table reshape2

所以我开始考虑data.table以列为中心的方法,我认为如果我没有为了进行矩阵乘法而没有进行混合会很有趣,而是只是按照列的方式做了整个事情。并查看data.table如何与%*%叠加。

但是要进行真正的比较,你必须做得对。

我想出了(据我所知)最直接的方法:

# Make some 'matrices'
dt <- data.table(expand.grid(x = 1:1000, y = 1:1000))
dt2 = data.table(expand.grid(x = 1:1000, y = 1:1000))

# Generate some data
set.seed(531)
dt[, z := sample(1:0,1000000,replace = TRUE)]
dt2[, z := sample(1:0,1000000,replace = TRUE)]

setkey(dt,'y')
setkey(dt2, 'x')

dtcartprod <- dt[dt2, allow.cartesian=TRUE]
dtresult = dtcartprod[,.(z = sum(z*i.z)),by = c('x','i.y')]

这会得到正确的结果,但比acast + %*%慢得多 它甚至都不好笑。 (至少20倍)

显然我应该这样做:

我应该加入一个联盟吗?或者对我的加入更聪明?有没有更好的办法?我听说您可以在加入时聚合,但我不知道该怎么做,因为我需要命名在聚合过程中创建的变量。

编辑:acast版本: result <- melt(acast(dt, x ~ y, value.var = 'z') %*% acast(dt2, x ~ y, value.var = 'z'))

0 个答案:

没有答案