所有两种组合的频率

时间:2014-05-27 14:14:36

标签: r

我有一组用户和产品

user    product
a       X
a       Y
a       Z
b       Z
c       Y
c       Z
...

我希望从中获得产品的所有成对组合列表以及具有该特定组合的用户频率,例如

product_1    product_2     N
X            Y             1          <- user a
X            Z             1          <- user a
Y            Z             2          <- users a,c
...

到目前为止,我已成功列出了所有产品组合

data = data.frame(users=c('a','a','a','b','c','c'), products = c("X","Y","Z","Z","Y","Z"))
combinations = t(combn(unique(data$products), 2))

但当我实施一个丑陋的for循环来迭代组合并从原始数据集中获取信息时,它就不会完成(实际数据大约是1k产品和50万用户,25m总共行。)

您将采用什么策略来实现此目标?

修改

添加了一列数据以使事情更加清晰。结果应计算同时包含product_1 product_2的用户数(即使他们还有其他产品)。

2 个答案:

答案 0 :(得分:2)

使用@ Roland的DF对象,您也可以

tt<-with(DF, table(user,product))
tt<-crossprod(tt)
tt[upper.tri(tt, T)]<-0
as.data.frame(as.table(tt))

将为您提供所有组合的计数,甚至是0。

答案 1 :(得分:1)

DF <- read.table(text="user    product
a       X
a       Y
a       Z
b       Z
c       Y
c       Z", header=TRUE)

res <- combn(as.character(unique(DF$product[!duplicated(DF)])), 2, function(i, DF) {
  tmp <- DF[DF$product %in% i, "user"]
  cbind.data.frame(t(i), freq=sum(duplicated(tmp)))
}, DF=DF, simplify=FALSE)

do.call(rbind, res)
#  1 2 freq
#1 X Y    1
#2 X Z    1
#3 Y Z    2

这可能不是最有效的解决方案。对于每个产品组合,它会获取数据的子集,然后计算重复的用户。