2013-10-24 3 views
8

C'è una domanda più efficiente di quanto segueuso efficiente di R data.table e unico()

DT[, list(length(unique(OrderNo))),customerID] 

per perfezionare un tavolo formato lungo con ID cliente di, numero d'ordine e gli elementi pubblicitari di prodotti, il che significa che non vi saranno le righe duplicate con lo stesso ID ordine se un cliente ha acquistato più di 1 articolo in quella transazione.

Cercando di elaborare gli acquisti unici. length() fornisce un conteggio di tutti gli ID ordine per ID cliente compresi i duplicati, cercando solo il numero univoco.

Modifica da qui:

Ecco alcuni codici fittizi. Idealmente, quello che sto cercando è l'output della prima query utilizzando lo unique().

df <- data.frame(
      customerID=as.factor(c(rep("A",3),rep("B",4))), 
      product=as.factor(c(rep("widget",2),rep("otherstuff",5))), 
      orderID=as.factor(c("xyz","xyz","abd","qwe","rty","yui","poi")), 
      OrderDate=as.Date(c("2013-07-01","2013-07-01","2013-07-03","2013-06-01","2013-06-02","2013-06-03","2013-07-01")) 
      ) 

DT.eg <- as.data.table(df) 
#Gives unique order counts 
DT.eg[, list(orderlength = length(unique(orderID))),customerID] 
#Gives counts of all orders by customer 
DT.eg[,.SD, keyby=list(orderID, customerID)][, .N, by=customerID] 

     ^
     | 
    This should be .N, not .SD ~ R.S. 
+0

@Ricardo, basta n fatto questo, sì, questo ha funzionato. Saluti. – digdeep

risposta

12

se si sta cercando di contare il numero di acquisti unici per cliente, utilizzare

DT[, .N, keyby=list(customerId, OrderNo)][, .N, by=customerId] 
+0

Bello. Grazie Ricardo !! – digdeep

+0

senza sudore! buona fortuna –

+0

In realtà, mi dispiace Ricardo, stavo solo valutando l'uscita di testa, tuffandomi nel tavolo ho scoperto che mi sta ancora dando il conteggio di tutti gli ordini degli articoli pubblicitari piuttosto che il conteggio unico degli ordini. Ho modificato il mio post originale con del codice da riprodurre. l'unico() finisce per uccidere il processo su una vasta base di clienti. – digdeep

1

A partire dalla versione 1.9.6 (il CRAN 19 settembre 2015), data.table ha guadagnato la funzione di supporto uniqueN() che è equivalente a length(unique(x)) ma molto più veloce (secondo data.table NEWS).

Con questo,

DT.eg[, list(orderlength = length(unique(orderID))),customerID] 

e

DT.eg[,.N, keyby=list(orderID, customerID)][, .N, by=customerID] 

può essere riscritta come

DT.eg[, .(orderlength = uniqueN(orderID)), customerID] 
customerID orderlength 
1:   A   2 
2:   B   4