【问题标题】:Count common items between different users统计不同用户之间的共同项目
【发布时间】:2013-08-21 06:19:22
【问题描述】:

我有一个不同用户 (USER) 的数据框。每个用户都有不同的物品(ITEM):

USER DATE ITEM
A 1 alpha
A 1 beta
A 1 gamma
A 2 alpha
A 2 gamma
A 4 beta
A 4 gamma
B 1 alpha
B 1 beta
...

对于不同长度的项目的不同组合,我想统计具有特定组合的用户数。

输出应该是这样的:

amount_of_users combination_of_items
2 (alpha,beta)
1 (alpha,gamma)
1 (beta,gamma)
1 (alpha, beta, gamma)

如果用户有项目 alpha,任何 2-,3-,4-项目组合,他应该出现,因为他清楚地得到了该项目与其他项目 - 但仍然在同一天。

更新: 正如 DWin 正确指出的那样,我不清楚我试图实现什么。 让一个用户拥有项目:alpha,beta,gamma。然后这个用户应该被添加到它的任何子集的每个计数中,这意味着组合 (alpha,beta) (beta,gamma) (alpha,gamma) 和最后 (alpha, beta, gamma) 都得到 count+1。

与此同时,我想,对于我的主要目标(我想看看,最突出的项目是什么,被添加到特定的项目中,例如 alpha),我可以使用 table 和 colSums 来计算用户数量,请找到我非常糟糕的解决方案,但指出项目,被添加最多。

levels(x$TARGETGROUP)[c(8,15:17,39,41,57,58,61)] <- c("HOME")
levels(x$TARGETGROUP)
dings <- table(x[,1],x[,3])
str(dings)
#i saw, that the 8th column contains item I needed.
haeuf <- colSums(dings[dings[,8]!=0, ]) 

【问题讨论】:

  • 请根据此输入发布您期望的示例输出。
  • 让我换个说法:对于您提供的 7 行数据,预期的输出是什么?
  • 对不起,你是对的,日期还是固定的。
  • 当您键入“这些其他项目中出现最多的项目”时,您是什么意思。我看到多个项目并且没有计数。那么“最频繁”的ITEM是如何记录的呢?
  • 好吧,我不太明白这个问题。输出清楚地表明,最常用的组合是 (alpha, beta),这意味着用户在 alpha 旁边获取的项目是 beta。

标签: r count combinations


【解决方案1】:

也可以使用arules 包。

# Data
d0<- read.delim( textConnection("USER DATE ITEM
A 1 alpha
A 1 beta
A 1 gamma
A 2 alpha
A 2 gamma
A 4 beta
A 4 gamma
B 1 alpha
B 1 beta"), sep=" ")

# Reshape the data and compute all the itemsets
library(arules)
library(reshape2)
d <- dcast( USER ~ ITEM, data = d0 )[,-1] > 0
r <- apriori( d, par = list(target="frequent itemsets", support = 0, minlen=2) )

# Display the results
inspect(r)
as( r, "data.frame" )
within( as( r, "data.frame" ), { count = support * nrow(d) } )
#                items support count
# 1       {beta,gamma}     0.5     1
# 2      {alpha,gamma}     0.5     1
# 3       {alpha,beta}     1.0     2
# 4 {alpha,beta,gamma}     0.5     1

这不考虑日期。如果您想按日期和用户分隔项目集:

d <- dcast( USER + DATE ~ ITEM, data = d0, fun.aggregate=length )[,-(1:2)] > 0
r <- apriori( d, par = list(target="frequent itemsets", support = 0, minlen=2) )
within( as( r, "data.frame" ), { count = support * nrow(d) } )
#                items support count
# 1       {alpha,beta}    0.50     2
# 2      {alpha,gamma}    0.50     2
# 3       {beta,gamma}    0.50     2
# 4 {alpha,beta,gamma}    0.25     1

【讨论】:

    【解决方案2】:

    这是需要的吗?

     aggregate(dd$ITEM, 
                by= dd[, c('USER','DATE')], 
                FUN=function(x) list(as.character(x)) )
    
      USER DATE                  x
    1    A    1 alpha, beta, gamma
    2    B    1        alpha, beta
    3    A    2       alpha, gamma
    4    A    4        beta, gamma
    

    (最后一段对我来说毫无意义。)

    【讨论】:

    • 我认为当用户日期配对的项目超过 2 个时,OP 还想要项目的所有子集。所以日期 1 中的用户 A 还需要一个“alpha, beta”行和一个“beta, gamma”行。
    • @Marius 是对的。但这只是基本的输入表。之后,我想计算包含一个特定值+组合本身的组合,如我的第一篇文章中所述。
    • 我不同意在帖子中说明或举例说明这一点。因此,如果 USER 在某一天拥有alpha.beta.gamma,那么这应该算作“alpha.beta”、“alpha.gamma”和“beta.gamma”所有类别中的一个?您想要计算长度大于 1 的集合和所有真子集吗?
    • 对不起,我刚刚又看了一遍我的帖子,你是对的,我写的内容不太清楚。是的。这就是我想要实现的。但我得到了另一种方式,我会更新我的条目发布。
    【解决方案3】:

    我认为 lala88 也想要频率,一种解决方案可能是:

    require("combinat")
    
    m<-max(sapply(split(dd, f=dd$USER), function(x) length(unique(x[, "ITEM"]))))
    
    fun<-function(i, dd){
      ind <- sapply(split(dd, f=dd$USER), function(x) length(unique(x[, "ITEM"]))>=i)
      res <- lapply(split(dd, f=dd$USER)[ind],
                     function(x) combn(unique(x$ITEM), i,
                                       simplify = FALSE,
                                       fun=paste, collapse=" "))
    table(unlist(res))
    }
    
    
    lapply(2:m, fun, dd=dd)
    

    还有改进我的代码的空间...所以请随时进行编辑...

    【讨论】:

    • 非常感谢您的想法 - 唯一的问题是,我真的不知道不同字符串的最长组合可以有多长。 :)
    • ...只是为了提供一个完整的解决方案:)
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多