2013-08-21 40 views
0

如何使用table()? 條目表,我有:使用table()來計算因子的頻率r

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

如果用戶使用了該項目「阿爾法」在同一天的另一項目,哪些是其他項目和這些項目的哪些是目前最?

我需要爲此使用的數據幀非常龐大,擁有超過200萬條記錄(至少對我來說這是巨大的^^)。 我用了幾次table(),但仍然無法弄清楚如何使用它來滿足我的需求。

UPDATE: 輸出應該是這樣的:

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

我更新了主表,顯示什麼這裏的主要問題是: 如果用戶擁有的項目阿爾法,任何2-,3- - ,4項組合計數,他應該出現在,因爲他顯然與其他物品 - 但仍然在同一天。

更新: 由於迪文正確地表明,我不清楚我試圖達到什麼。 讓一個用戶擁有項目:alpha,beta,gamma。然後,這個用戶應該被添加到每個計數的任何子集,這意味着組合(alpha,beta)(beta,gamma)(alpha,gamma)和最後(alpha,beta,gamma)都會得到count +1。

與此同時,我認爲,對於我的主要目標(我想看看,什麼是最重要的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

請發佈基於此輸入的預期輸出示例。 – A5C1D2H2I1M1N2O1R2T1

+3

讓我改述一下:對於您提供的7行數據,預期的輸出是什麼? – A5C1D2H2I1M1N2O1R2T1

+0

對不起,你是對的,仍然固定在日期。 – Mustafa

回答

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 

(最後一段是沒有意義對我來說)

+0

我認爲當用戶日期配對超過2個項目時,OP也希望項目的所有子集。因此,用戶A在日期1中也需要「alpha,beta」行和「beta,gamma」行。 – Marius

+0

@Marius是對的。 但這只是基本的輸入表。之後,我想要獲得包含一個特定值+組合本身的組合的計數,正如我的第一篇文章中所述。 – Mustafa

+0

我不同意這是在帖子中陳述或舉例。因此,如果USER有一天有'alpha.beta.gamma',那麼這應該算作所有'alpha.beta','alpha.gamma'和'beta.gamma'類別中的一個?你想要的集合和長度大於1的所有適當的子集計數? –

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) 

仍然有改進的餘地我的代碼...所以隨時進行編輯...

+0

非常感謝您的想法 - 唯一的問題是,我真的不知道不同字符串的最長組合能夠持續多久。 :) – Mustafa

+0

...只是爲了提供一個完整的解決方案:) – holzben

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