我想使用arules:apriori
函数在R中执行关联规则挖掘,并且需要transactions
类型输入。这只是一系列因素,每个元素代表在该交易中购买的唯一产品组。以下示例:
products transaction
1 {a,b} 1
2 {a,b,c} 2
3 {b} 3
在软件包文档中,他们建议使用split
生成此代码:
split(DT[,"products",with=FALSE], DT[,"transaction",with=FALSE])
但是当我在大量交易中尝试相同时,它的速度非常缓慢。示例MWE如下:
library(data.table)
#Number of transactions
ntrxn = 1000000
#Generating a dummy transactions table
#Recycling transaction vector over products
DT = data.table(transaction = seq(1,ntrxn,1)
,products = rep(letters[1:3],ntrxn))[order(transaction)]
TEST = split(DT[,"products",with=FALSE], DT[,"transaction",with=FALSE])
有没有办法通过利用data.table
by
条件加快速度?我试过这个:
DT[,list(as.factor(.SD$products)),by=transaction]
但它只是让我回到了data.table
(事后才有意义)。有没有办法使用类似表达式的矢量列表,但通过利用高性能data.table
内部来处理繁重的工作。
如果单独data.table
不是答案,我真的很好奇哪种方法可以让我得到我想要的输出。
答案 0 :(得分:3)
包装OP的最后一行代码以制作列表列:
DT[, .(.(products)), by=transaction]
.()
是list()
的别名。无论如何,这在我的电脑上更快。