我如何使用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 的早期阶段,并且不需要(还)一个真正告诉我用户数量的数字,但只是告诉我某种倾向。
答案 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)
仍然有改进我的代码的空间...所以随意编辑...