2013-06-17 3 views
5

Desidero creare un oggetto transazione nel formato di un carrello che posso chiamare in qualsiasi momento per le mie analisi. I dati contengono elementi separati da virgola con 1001 transazioni. I primi 10 transazioni simile a questa:Analisi di associazione con transazioni duplicate utilizzando il pacchetto arules in R

hering,corned_b,olives,ham,turkey,bourbon,ice_crea 
baguette,soda,hering,cracker,heineken,olives,corned_b 
avocado,cracker,artichok,heineken,ham,turkey,sardines 
olives,bourbon,coke,turkey,ice_crea,ham,peppers 
hering,corned_b,apples,olives,steak,avocado,turkey 
sardines,heineken,chicken,coke,ice_crea,peppers,ham 
olives,bourbon,coke,turkey,ice_crea,heineken,apples 
corned_b,peppers,bourbon,cracker,chicken,ice_crea,baguette 
soda,olives,bourbon,cracker,heineken,peppers,baguette 
corned_b,peppers,bourbon,cracker,chicken,bordeaux,hering 
... 

ho osservato che non ci sono duplicati transazioni nei dati e li rimossi ma ogni volta che ho provato a leggere i rapporti, ottengo:

Error in asMethod (oggetto): non può costringere la lista con le transazioni con gli oggetti duplicati

Ecco il mio codice:

data <- read.csv("AssociationsItemList.txt",header=F) 
data <- data[!duplicated(data),] 
pop <- NULL 
for(i in 1:length(data)){ 
pop <- paste(pop, data[i],sep="\n") 
} 
write(pop, file = "Trans", sep = ",") 
transdata <- read.transactions("Trans", format = "basket", sep=",") 

sono sicuro che esimo E 'qualcosa di ancora poco importante che mi sia sfuggito. Gentilmente offri la tua assistenza.

+0

Mi dispiace, stai scrivendo come un file CSV (o qualcosa di simile) hai provato a leggere.csv o read.table alla fine? –

+0

come viene creato il file di transazione sopra senza colonne di intestazione – Pallavi

risposta

15

Il problema non è con transazioni duplicate (la stessa riga appare due volte) ma articoli duplicati (lo stesso elemento appare due volte, nella stessa transazione - ad esempio "olive" nella riga 4).

read.transactions ha un argomento rm.duplicates per rimuovere quei duplicati.

read.transactions("Trans", format = "basket", sep=",", rm.duplicates=TRUE) 
+2

Ti dispiacerebbe spiegare perché non sono consentiti articoli duplicati nella stessa transazione? E se ad esempio volessi dimostrare di aver acquistato il doppio della normale quantità di olive? Ad esempio, nei dati della mia transazione c'è una colonna di quantità e non ero sicuro di come fare per farlo – Blou91

1

Vincent Zoonekynd ha ragione, il problema è causato da elementi duplicati in una transazione. Qui posso spiegare perché il arules richiede transazioni senza elementi duplicati.

  • I dati di transactions sono deposito internamente come oggetto ngCMatrix. codice sorgente rilevante:

    setClass("itemMatrix", 
        representation(
        data  = "ngCMatrix", 
    ... 
    setClass("transactions", 
        contains = "itemMatrix", 
    ... 
    
  • ngCMatrix è una matrice sparsa definito a Matrix pacchetto. È descrizione da documento ufficiale:

    La classe nsparseMatrix è una classe virtuale di sparsi “modello” matrici, ossia matrici binarie concettualmente con voci TRUE/FALSE. Solo le posizioni degli elementi che sono vere sono memorizzati

Sembra ngCMatirx stato memorizzato di un elemento da un indicatore binario. Il che significa che l'oggetto transactions in arules può memorizzare solo esistente/non esistente per un oggetto di transazione e non può registrare quantità. Quindi ...

0

Ho appena usato la funzione 'unica' per rimuovere i duplicati. I miei dati erano leggermente diversi dato che avevo un dataframe (i dati erano troppo grandi per un CSV) e avevo 2 colonne: product_id e transaction_id. So che non è la tua domanda specifica, ma dovevo farlo per creare il set di dati della transazione e applicare le regole di associazione.

data # > 1 Million Transactions 
data <- unique(data[ , 1:2 ]) 
trans <- as(split(data[,"product_id"], data[,"trans_id"]),"transactions") 
rules <- apriori(trans, parameter = list(supp = 0.001, conf = 0.2))