2013-10-24 2 views
8

वहाँ निम्नलिखितकुशल उपयोग

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

की तुलना में एक अधिक कुशल क्वेरी ग्राहक पहचान-पत्र, आदेश संख्या और उत्पाद लाइन आइटम के साथ एक लंबे प्रारूप तालिका परिष्कृत करने के लिए है, जिसका अर्थ है कि वहाँ यदि ग्राहक ने उस लेनदेन में 1 से अधिक आइटम खरीदे हैं तो उसी ऑर्डर आईडी के साथ डुप्लिकेट पंक्तियां होंगी।

अद्वितीय खरीदारी करने की कोशिश कर रहा है। length() डुप्लिकेट समेत ग्राहक आईडी द्वारा सभी ऑर्डर आईडी की गिनती देता है, केवल अद्वितीय संख्या की तलाश में।

यहां से

संपादित करें:

यहाँ कुछ डमी कोड है। आदर्श रूप से मैं जो खोज रहा हूं वह 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, बस n लिखा जा सकता है यह कहा कि, हाँ, यह चाल है। खुश होती है। – digdeep

उत्तर

12

यदि आप प्रति ग्राहक अद्वितीय खरीदारियों की संख्या की गणना करने के लिए कोशिश कर रहे हैं,

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

अच्छा। धन्यवाद रिकार्डो !! – digdeep

+0

कोई पसीना नहीं! शुभकामनाएं –

+0

असल में, माफ करना रिकार्डो, केवल मुख्य आउटपुट का आकलन कर रहा था, तालिका में डाइविंग मैंने पाया कि यह अभी भी मुझे ऑर्डर की अनूठी गिनती के बजाए सभी लाइन आइटम ऑर्डर की गिनती दे रहा है। मैंने अपनी मूल पोस्ट को पुन: उत्पन्न करने के लिए कुछ कोड के साथ संपादित किया है। अद्वितीय() एक बड़े ग्राहक आधार पर प्रक्रिया को मारने के समाप्त होता है। – digdeep

1

का उपयोग संस्करण 1.9.6 के रूप में (क्रैन 19 सितं, 2015 को), data.table सहायक समारोह uniqueN() प्राप्त की है जो length(unique(x)) के बराबर है लेकिन बहुत तेज है (data.table NEWS के अनुसार)।

इस के साथ

,

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

और

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

रूप

DT.eg[, .(orderlength = uniqueN(orderID)), customerID] 
customerID orderlength 
1:   A   2 
2:   B   4 
संबंधित मुद्दे