2013-10-24 16 views
8

Có một truy vấn hiệu quả hơn sausử dụng hiệu quả data.table R và độc đáo()

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

để tinh chỉnh một bảng định dạng DÀI với id khách hàng, số thứ tự và chi tiết sản phẩm, có nghĩa là có sẽ là các hàng trùng lặp có cùng id thứ tự nếu khách hàng đã mua nhiều hơn 1 mặt hàng trong giao dịch đó.

Cố gắng tìm ra các giao dịch mua duy nhất. length() cung cấp số lượng ID của tất cả các ID đặt hàng theo ID khách hàng bao gồm các từ khóa trùng lặp, chỉ tìm kiếm số duy nhất.

Chỉnh sửa từ đây:

Dưới đây là một số mã giả. Lý tưởng nhất là những gì tôi đang tìm kiếm là đầu ra từ truy vấn đầu tiên sử dụng 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, chỉ cần n oticed rằng, yep, đã làm các trick. cổ vũ. – digdeep

Trả lời

12

nếu bạn đang cố gắng để đếm số lượng mua hàng duy nhất cho mỗi khách hàng, sử dụng

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

Tuyệt. Cảm ơn Ricardo !! – digdeep

+0

không đổ mồ hôi! Chúc may mắn –

+0

Thực ra, xin lỗi Ricardo, chỉ đánh giá đầu ra, đi sâu vào cái bàn mà tôi thấy nó vẫn mang lại cho tôi số lượng đơn đặt hàng của đơn đặt hàng thay vì số lượng đơn đặt hàng duy nhất. Tôi đã chỉnh sửa bài đăng gốc của mình bằng một số mã để tái tạo. unique() kết thúc bằng cách giết chết quá trình trên một cơ sở khách hàng lớn. – digdeep

1

Tính đến phiên bản 1.9.6 (trên cran ngày 19 tháng 9 2015), data.table đã đạt được các chức năng helper uniqueN() tương đương với length(unique(x)) nhưng nhanh hơn nhiều (theo số data.table NEWS).

Với điều này,

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

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

có thể được viết lại như

DT.eg[, .(orderlength = uniqueN(orderID)), customerID] 
customerID orderlength 
1:   A   2 
2:   B   4 
Các vấn đề liên quan