0

我有一个不同用户(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。

同时我想,对于我的主要目标(我想看看,最突出的项目是什么,被添加到特定的项目,例如阿尔法)我可以只计算用户的数量,使用表和 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, ]) 
4

3 回答 3

2

也可以使用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
于 2013-08-21T10:10:08.993 回答
0

我认为 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)

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

于 2013-08-21T10:04:34.580 回答
0

这是需要的吗?

 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

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

于 2013-08-21T08:36:09.760 回答