2013-10-24 15 views
8

Gibt es eine effizientere Abfrage als die folgendeneffiziente Nutzung von R data.table und einzigartig()

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

eine LONG-Format Tabelle mit Kunden-IDs, Bestellnummer und Produktpositionen zu verfeinern, was bedeutet, dass es Es handelt sich um doppelte Zeilen mit derselben Auftrags-ID, wenn ein Kunde mehr als einen Artikel in dieser Transaktion gekauft hat.

Versuch, einzigartige Einkäufe zu erarbeiten. length() zählt alle Bestell-IDs nach Kundennummer einschließlich Dubletten und sucht nur nach der eindeutigen Nummer.

Edit von hier:

Hier ist ein Dummy-Code. Im Idealfall suche ich nach der Ausgabe der ersten Abfrage unter Verwendung der 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, nur n neu geschrieben werden Das hat man begriffen, ja, das war der Trick. Prost. – digdeep

Antwort

12

, wenn Sie die Anzahl der eindeutigen Käufe pro Kunde, verwenden

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

Schön. Danke Ricardo !! – digdeep

+0

kein Schweiß! Viel Glück –

+0

Eigentlich, sorry Ricardo, war nur die Beurteilung der Kopf-Ausgabe, Tauchen in die Tabelle, die ich finde, es gibt mir immer noch die Zählung aller Werbebuchungen Bestellungen statt einzigartige Anzahl der Aufträge. Ich habe meinen ursprünglichen Beitrag mit etwas Code bearbeitet, um ihn zu reproduzieren. Die unique() beendet den Prozess bei einem großen Kundenstamm. – digdeep

1

Ab Version 1.9.6 zu zählen versuchen (auf CRAN 19. September 2015), hat data.table die Helferfunktion gewonnen uniqueN() das entspricht length(unique(x)) aber viel schneller (nach data.table NEWS).

Damit

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

und

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

als

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