2015-06-27 80 views
0

我試圖找出一種方式來獲得與R.獨特的用戶產品組合的列表這是一個後續的問題[DF的Generate matrix of unique user-item cross-product combinations產品使用組合

df <- data.frame(Products=c('Product a', 'Product b', 'Product a', 
          'Product c', 'Product b', 'Product c', 'Product d'), 
       Users=c('user1', 'user1', 'user2', 'user1', 
         'user2','user3', 'user1')) 

輸出是:

Products Users 
1 Product a user1 
2 Product b user1 
3 Product a user2 
4 Product c user1 
5 Product b user2 
6 Product c user3 
7 Product d user1 

我要找的輸出是所有三個產品組合:

Product a/Product b/Product c - 3 
Product a/Product b/Product d - 2 
Product b/Product c/Product d - 3 
... 

釷再次尋求你的幫助。

回答

2

它看起來像你想要邏輯或處理作爲用戶和每個產品集之間的關係。換句話說,您想要統計有多少獨特用戶在集合中有任何產品。下面是做這件事的一種方法:

df <- data.frame(Products=c('Product a','Product b','Product a','Product c','Product b','Product c','Product d'),Users=c('user1','user1','user2','user1','user2','user3','user1')); 
comb <- combn(unique(df$Products),3); 
data.frame(comb=apply(comb,2,function(x) paste(levels(comb)[x],collapse='/')),num=apply(comb,2,function(x) length(unique(df$Users[as.integer(df$Products)%in%x])))); 
##       comb num 
## 1 Product a/Product b/Product c 3 
## 2 Product a/Product b/Product d 2 
## 3 Product a/Product c/Product d 3 
## 4 Product b/Product c/Product d 3 

編輯:邏輯與是棘手的,因爲我們需要測試每一個產品的存在用戶。我認爲我找到了一個很好的解決方案,使用aggregate()match()

data.frame(comb=apply(comb,2,function(x) paste(levels(comb)[x],collapse='/')),num=apply(comb,2,function(x) sum(aggregate(Products~Users,df,function(y) !any(is.na(match(x,as.integer(y)))))$Products))); 
##       comb num 
## 1 Product a/Product b/Product c 1 
## 2 Product a/Product b/Product d 1 
## 3 Product a/Product c/Product d 1 
## 4 Product b/Product c/Product d 1 
+0

這很有效。如果我想得到邏輯與而不是OR,我將如何改變它。 – prasara

+0

@prasara請參閱編輯。 – bgoldst