base:split()实现 - R / data.table中更快的选项

时间:2016-09-07 01:00:02

标签: r algorithm data.table

我想使用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不是答案,我真的很好奇哪种方法可以让我得到我想要的输出。

1 个答案:

答案 0 :(得分:3)

包装OP的最后一行代码以制作列表列:

DT[, .(.(products)), by=transaction]

.()list()的别名。无论如何,这在我的电脑上更快。