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也能有所改进。你会的。
我想使用 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
可以解决我原来的问题。这里我列出答案(根据
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也能有所改进。你会的。