2013-10-24 48 views
8

有沒有更高效的查詢比下面高效利用[R data.table和獨特的()的

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

細化客戶的ID,訂單號和產品線的料長格式表,這意味着如果客戶在該交易中購買了多於一件商品,那麼將具有相同訂單ID的重複行。

試圖制定出獨特的購買。 length()根據包含重複項的客戶ID給出所有訂單編號的計數,僅查找唯一編號。

編輯從這裏:

這是一些虛擬代碼。理想情況下,我要查找的是使用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

事實上,對不起裏卡多,只是評估頭部輸出,潛入表中,我發現它仍然給我所有行項目訂單的數量,而不是唯一的訂單數。我用一些代碼編輯了我的原始文章以重現。 unique()最終會在一個龐大的客戶羣中扼殺流程。 – digdeep

1

隨着1.9.6版本(CRAN上2015年9月19日),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