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

时间:2015-02-18 20:17:50

标签: r data.table

我想通过使用table函数将data.table对象转换为以下条件。这意味着,colb为同名,cola为rownames,然后如果个人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

但是当数据集很大时,例如在我的情况下有3,900万行乘2列,表操作需要大约80秒才能完成。

我想知道是否有更有效的方法来执行与表函数相同的操作?

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

谢谢。

1 个答案:

答案 0 :(得分:2)

首先,感谢@Arun和所有人。是的,sparseMatrix可以解决我原来的问题。在这里,我列出了答案(根据Arun's suggestion)。这是一个演示示例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秒。谢谢,这是完美的。 其次,希望对于我目前的帖子的问题,data.table也可以给出改进。你会的。