2015-10-06 48 views
6

我有數據顯示客戶購買了某些項目。他們可以多次購買物品。我需要的是一個表格,其中顯示了所有可能的成對物品組合以及購買該組合的客戶的唯一數量(表格的對角線將只是購買每件物品的唯一人數)。使用R中的一列中的所有值對創建表,計算唯一值

下面是一個例子:

item <- c("h","h","h","j","j") 
customer <- c("a","a","b","b","b") 
test.data <- data.frame(item,customer) 

這裏是test.data:

item customer 
h a 
h a 
h b 
j b 
j b 

結果所需要的 - 與項目作爲行和列名的表,具有獨特的客戶數在桌子內購買一雙。因此,2位顧客購買了物品h,1購買了物品h和j,併購買了1件物品j。

item h j 
h  2 1 
j  1 1 

我已經使用表函數試圖,melt/cast等,但沒有得到我,我需要在表內計數。我的第一步是使用unique()擺脫重複的行。

+2

你是在談論3客戶,但我只看到2在你的'測試。 data'。 – Jaap

+0

您將無法將此擴展到兩個項目之外。也許你應該考慮代表它的另一種方式。 – Frank

+0

@Jaap,顧客b同時購買了項目h和j,因此它們被包括在所有四種組合中(表格中的內容是「購買h的兩位顧客也購買了h」,「購買h的一位顧客也購買了j」和「1購買j的顧客也購買了j「 - 是的,對角線值解釋是奇怪的,但那正是我需要的。 – user1228982

回答

5

使用data.tablegtools包,我們可以通過客戶重新創建所有可能的排列:

library(data.table) 
library(gtools) 

item <- c("h","h","h","j","j") 
customer <- c("a","a","b","b","b") 
test.data <- data.table(item,customer) 

DT <- unique(test.data) #The unique is used as multiple purchases do not count twice 

tuples <- function(x){ 
    return(data.frame(permutations(length(x), 2, x, repeats.allowed = T, set = F), stringsAsFactors = F)) 
} 

DO <- DT[, tuples(item), by = customer] 

這給:

customer X1 X2 
1:  a h h 
2:  b h h 
3:  b h j 
4:  b j h 
5:  b j j 

這是所有獨特項目配對客戶有列表。根據你的例子,我們將h x j與j x h不同。現在,我們可以使用表函數來獲取每對頻率:

table(DO$X1,DO$X2) 
    j h 
    j 1 1 
    h 1 2 
+0

@Chris,謝謝你的回覆。這對於我提供的小例子非常有用,但是原始數據集中有數百萬行(儘管少於100個獨特的項目),所以我不確定這將如何擴展! – user1228982

+0

@ user1228982有100個客戶,100個產品和1,000,000個行,這在我的電腦上運行時間不到一秒鐘。使用'項<試驗 - 樣品(1:100,1000000,替換= T)''顧客< - 樣品(1:100,1000000,替換= T)' – Chris

+0

@ user1228982雖然它比弗蘭克的溶液 – Chris

5

這裏有一個基礎R解決方案:

n_intersect <- Vectorize(function(x,y) length(intersect(x,y))) 

cs_by_item <- with(test.data, tapply(customer, item, unique)) 

outer(cs_by_item , cs_by_item , n_intersect) 
# h j 
# h 2 1 
# j 1 1 
+0

一個較小的數據集時,我試圖用我的全部數據使用您的解決方案很好工作,但是,它永遠不會結束。 – user1228982

+0

@ user1228982是的,我並不感到驚訝。 「外部」功能通常存在這樣的問題,消耗了大量的內存。 – Frank