使用table()来计算因子r的频率

时间:2013-08-21 06:19:22

标签: r

我如何使用table()? 我有的参赛表:

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
...

如果USER在同一个日期获得了另一个带有ITEM'alpha'的项目,那么另一个项目是什么?这些其他项目最多的是什么?

我需要使用的数据帧非常庞大,拥有超过200万个条目(好吧,至少对我来说这是非常大的^^)。  我曾经使用过table()几次,但仍然无法弄清楚如何根据我的需要使用它。

更新: 输出应该是这样的:

amount_of_users combination
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)都得到计数+1。 / p>

与此同时,我想,对于我的主要目标(我想看看,哪些是最突出的ITEMS,被添加到特定的ITEM,例如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, ]) 

同样,这个解决方案显然非常脏,但我还处于学习 R 的早期阶段,并且不需要(还)一个真正告诉我用户数量的数字,但只是告诉我某种倾向。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

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

答案 2 :(得分: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)

仍然有改进我的代码的空间...所以随意编辑...