R:加速 'table()' 对象的 data.table 操作

R: speed up 'table()' operation for a data.table object

我想使用 table 函数将 data.table 对象转换为以下条件。这意味着,colb 作为列名,cola 作为行名,然后如果个人 col 包含相应的 row,则将条目作为 1,否则0。我这样做:

dt <- data.table(cola = c(1, 1, 2, 3), colb = c(10, 20, 30, 40))
dt
table(dt)

> dt
   cola colb
1:    1   10
2:    1   20
3:    2   30
4:    3   40
> table(dt)
colb
cola 10 20 30 40
   1  1  1  0  0
   2  0  0  1  0
   3  0  0  0  1

但是当数据集很大时,例如在我的例子中有 3900 万行 x 2 列,table 操作需要大约 80 秒才能完成。

我想知道是否有更有效的方法来完成与 table 函数相同的事情?

此外,dcast.data.table(dt, cola ~ colb, fill = 0L)在我尝试时做了同样的事情,但结果有一点不同,应该进一步处理以获得与table函数相同的结果。重要的是 dcast.data.table 在我尝试我的数据时没有提高速度。所以,我希望有人能帮助制定出更有效的方法来做同样的事情!

谢谢。

首先,感谢@Arun 和所有人。是的,sparseMatrix 可以解决我原来的问题。这里我列出答案(根据) . Here is just an demo example I originally hope:

dt <- data.table(sid = c(1, 2, 3, 4, 3, 2, 1, 6, 1, 2), 
                 aid = c(100, 100, 100, 100, 200, 200, 200, 300, 300, 300))
dt
library(Matrix)
sm <- sparseMatrix(dt[, sid], dt[, aid], x = TRUE)   
cp <- t(sm) %*% sm   
cp <- summary(cp)  
cp <- cp[cp$i < cp$j, ]     
as.data.frame(cp)
    i   j x
4 100 200 3
7 100 300 2
8 200 300 2

这个方法比我以前使用的方法('Ananda Mahto' method)更有效。我的数据集(39763098 行和 2 列)的时间比较:我的原始方法和 Arun 的方法分别为 ~141 秒 VS ~40 秒。所以谢谢,它是完美的。 第二,希望对于我目前post的问题,data.table也能有所改进。你会的。