2016-09-07 6 views
0

arules:apriori関数を使用してRでアソシエーションルールマイニングを実行したいとし、transactionsタイプの入力が必要です。これは、各要素がそのトランザクションで購入された一意の製品セットを表す要因のリストにすぎません。パッケージのドキュメントでbase:split()implementation - R/data.table内のより高速なオプション

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.tableby条件を活用することで、これをスピードアップする方法はありますか? (後知恵で理にかなっている)

DT[,list(as.factor(.SD$products)),by=transaction] 

しかし、それはちょうどdata.tableを私に戻っています:私はこれを試してみました。同様の表現を使用しているが、演奏者のdata.table内部を活用して重い吊り上げを処理する方法のリストがあります。

ここで答えがdata.tableだけではない場合は、私が探している出力にどのアプローチが必要なのか本当に不思議です。リスト列にするために、コードのOPの最後の行をラップ

+1

'system.time(lst < - split(DT $ products、DT $ transaction))'と 'system.time(lst < - split(DT"、 "products"、= F)、DT [ "トランザクション"、= F])) 'あなたがそれから得るものを見てください。ほぼ2桁の差異。なぜそれが起こっているのか分かりませんが、私は前のものがあなたが行かなければならないものだと思います。 – Psidom

+2

@Psidomも 'system.time(split(DT [、products]、DT [、transaction]))'を比較する - 問題は 'with = FALSE'です – thelatemail

+0

2つの違いの世界があります!私は後者が終了するのを待っていませんでした。あなたに質問する - 構文1と構文2の違いは何ですか? – sriramn

答えて

3

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

.()list()の別名です。これは私のコンピュータでは、とにかく高速です。

関連する問題