我有一个包含约100万个事务行的数据集,我试图从data.frame转换为事务类,以便在apriori
包的arules
函数中使用。我使用文档中讨论的表单:
a_df3 <- data.frame(
TID = c(1,1,2,2,2,3),
item=c("a","b","a","b","c", "b")
)
a_df3
trans4 <- as(split(a_df3[,"item"], a_df3[,"TID"]), "transactions")
但是,对于大块数据,这非常慢。有什么方法可以加快速度吗?
答案 0 :(得分:0)
将列表(split
的结果)转换为包ngCMatrix
中的稀疏Matrix
是非常昂贵的。主要是因为我们不能确定提供的交易中没有重复的项目,并且交易中的项目已经排序......
以下是一些实验代码,可直接将您的第一个data.frame转换为事务
library("arules")
library("Matrix")
a_df <- data.frame(
TID = c(1,1,2,2,2,3),
item=c("a","b","a","b","c", "b")
)
j <- as.integer(a_df$TID)
item <- factor(a_df$item)
i <- as.integer(item)
ngT <- new("ngTMatrix", i = i-1L, j = j-1L, Dim = c(max(i), max(j)),
Dimnames = list(levels(item), NULL))
ngC <- as(ngT, "ngCMatrix")
trans <- as(ngC, "transactions")
inspect(trans)
items itemsetID
[1] {a,b} 1
[2] {a,b,c} 2
[3] {b} 3
一百万次交易需要几秒钟而不是一分钟。小心使用代码(它不会检查输入数据),直到它进入arules
包。