2016-10-10 7 views
1

Ich habe Transaktionsdaten, die in einer Kantenform sind, und ich muss eine transaktionsbasierte Sparse-Matrix erstellen, die mit dem arules R-Paket verwendet werden kann. Zur Zeit verwende ich "Spread" aus dem Tidyr-Paket, um die Kantenliste in Matrix mit jeder Zeile als "Korb-ID zu konvertieren. Dann ich nach der Konvertierung in eine logische, da ich keine Mengeninformationen mit Arules verwenden kann, konvertiere ich die" Transaktion "basierte Datentyp. Bitte beachten Sie ein Beispiel für R-Code unten.Konvertieren von Kantenliste in eine Ares-Transaktion spärliche Adjazenzmatrix

Meine Frage ist, dass dies für kleine Sätze Korb/Transaktionen funktioniert, aber wenn ich viele mehr habe, verursacht es Speicherprobleme aufgrund der" Spread "-Funktion. ich frage mich, ob es einen Speicher/ressourceneffiziente Art und Weise ist, um die ursprüngliche Kante Blick auf die Transaktionen Datentyp zu konvertieren, die verwendet? Vielen Dank im Voraus für alle Anregungen arules!

## Load libraries 

library(tidyr) 
library(arules) 

## Create an example of the transactions that I am analizing 

TransEdgeList = data.frame(BasketID=c(1,1,2,2,3,3,3), 
           Item=c(10,11,10,12,10,11,13), 
           Qty=c(1,1,2,3,1,2,1)) 

#convert to something that arules can transform 
BasketDataFrame = spread(TransEdgeList, Item, Qty) 

#convert to logical 
BasketDataFrame[, 2:dim(BasketDataFrame)[2]]= 
    !is.na(BasketDataFrame[, 2:dim(BasketDataFrame)[2]]) 

#convert to a transaction sparse matrix that arules can use 
BasketMatrix = as(BasketDataFrame[, 2:dim(BasketDataFrame)[2]], "transactions") 

BasketMatrix 
+0

ist 'Tabelle' besser? 'table (TransEdgeList [1: 2])' oder 'xtabs (~ BasketID + Item, data = TransEdgeList, sparse = TRUE)' – user20650

Antwort

2

ich würde eine spärliche l manuell erstellen ogische Triplett-Matrix (ngTMatrix), wandeln Sie sie in eine spärliche ngCMatrix um, die dann in ein Transaktionsobjekt umgewandelt werden kann. Auf diese Weise wird niemals eine vollständige Matrixdarstellung erstellt, und Sie sollten in der Lage sein, gut zu speichern.

library(arules) 
library(Matrix) 

TransEdgeList <- data.frame(BasketID=c(1,1,2,2,3,3,3), 
    Item=c(10,11,10,12,10,11,13), 
    Qty=c(1,1,2,3,1,2,1)) 

m <- new("ngTMatrix", 
    i = as.integer(TransEdgeList$Item)-1L, 
    j = as.integer(TransEdgeList$BasketID)-1L, 
    Dim = as.integer(c(max(TransEdgeList$Item), max(TransEdgeList$BasketID)))) 

m <- as(m, "ngCMatrix") 

tr <- as(m, "transactions") 
inspect(tr) 

    items  itemsetID 
[1] {10,11} 1   
[2] {10,12} 2   
[3] {10,11,13} 3 
+0

Danke Michael! Das will ich nur brauchen. – Kevin

+0

Eine Alternative ist das Beispiel aus '? Transaktionen: "a_df3 <- data.frame ( TID = c (1,1,2,2,2,3), item = c (" a "," b "," a "," b ", "c", "b") ); trans4 <- als (split (a_df3 [, "Element"], a_df3 [, "TID"]), "Transaktionen") '. Ich denke, dass sollte ähnliche Leistung haben. –

Verwandte Themen