我想通过使用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
在我尝试数据时不会提高速度。所以,我希望有人可以帮助找出更有效的方法来做同样的事情!
谢谢。
答案 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也可以给出改进。你会的。