2015-06-27 47 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