2017-10-04 3 views
0

J'ai un ensemble de données avec ~ 1 million de lignes de transaction que j'essaie de convertir d'un data.frame en une classe de transaction à utiliser dans la fonction apriori du paquet arules. J'utilise la forme discutée dans la documentation:R arègles - moyen rapide de créer des transactions

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") 

Cependant, pour de grandes parties de données, ceci est extrêmement lent. Y a-t-il des moyens d'accélérer cela?

Répondre

0

La conversion d'une liste (le résultat de split) en un ngCMatrix clairsemé du paquet Matrix est coûteuse. Principalement parce que nous ne pouvons pas être sûr qu'il n'y a pas d'articles en double dans les transactions fournies et que les articles dans les transactions sont triés ...

Voici un code expérimental qui convertit directement votre premier data.frame en transactions

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 

Il prend pour un million de transactions quelques secondes au lieu d'une minute. Utilisez le code avec précaution (il ne vérifie pas les données d'entrée) jusqu'à ce qu'il fasse son chemin dans le paquet arules.