所以我开始考虑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'))