2013-02-26 111 views
4

我列出了大約100,000次出現的項目被排列在一起,我已粘貼到一列中,因此我可以統計每個組合出現的次數。
R中列表的出現次數

4845 Curly Fries California Burger 1 
4846 French Fries California Burger 1 
4847 Hamburger California Burger  1 
4848 $1 Fountain Drinks Curly Fries 1 
4849 $1 Fountain Drinks Curly Fries 1 
4850 California Burger Curly Fries 1 
4851 Curly Fries Curly Fries   1 

我已經探索了聚合函數使我有以下錯誤:

aggregate(t1$count,list(t1$pc), sum) <br> 
Error in sort.list(y) : 'x' must be atomic for 'sort.list' 
Have you called 'sort' on a list? <br> 

我也曾嘗試ddply的變化:

ddply(t1,t1$pc,transform,occurances=sum(t1$count)) 

但我得到這個錯誤

Error in UseMethod("as.quoted") : 
no applicable method for 'as.quoted' applied to an object of class "c('matrix', 'list')" 

我假設我得到這個,因爲我試圖通過一個字符值本質上「組」。我也根據對類似問題的回答探討了tapplyrecast,但無濟於事。

我怎樣才能得到這個組合數?

的考慮,單獨列出的項目(再次,道歉的格式問題)的一個樣本:

    Var1      Var2 Var3 
>2    Onion Rings    Onion Rings 1 
>3 Pineapple Cheddar Burger    Onion Rings 1 
>4    Onion Rings Pineapple Cheddar Burger 1 
>5 Pineapple Cheddar Burger Pineapple Cheddar Burger 1 
>5    Onion Rings    Onion Rings  1 
>6 Pineapple Cheddar Burger    Onion Rings 1 
>7    Onion Rings Pineapple Cheddar Burger 1 
>8 Pineapple Cheddar Burger Pineapple Cheddar Burger 1 
>9    Fountain Soda   Fountain Soda 1 
>10    French Fries   Fountain Soda 1 
+6

你可以使用'table'函數:'table(t1 $ pc)'。 – Justin 2013-02-26 19:51:36

回答

1

您的初始方法與我想要的非常接近。將這些組合成一個單一的因素肯定會奏效,只要你按照相同的順序將它們結合起來,這樣你就不會以「薯條,漢堡」和「漢堡,薯條」結束。

可能有更簡單的方法來做你想做的事,但我沒有腦子是什麼。儘管如此,我認爲這是你要找的東西:

# Let's assume your data looks like this: 
> df 
         Var1      Var2 Var3 
1    Onion Rings    Onion Rings 1 
2 Pineapple Cheddar Burger    Onion Rings 1 
3    Onion Rings Pineapple Cheddar Burger 1 
4 Pineapple Cheddar Burger Pineapple Cheddar Burger 1 
5    Onion Rings    Onion Rings 1 
6 Pineapple Cheddar Burger    Onion Rings 1 
7    Onion Rings Pineapple Cheddar Burger 1 
8 Pineapple Cheddar Burger Pineapple Cheddar Burger 1 
9    Fountain Soda    Fountain Soda 1 
10    French Fries    Fountain Soda 1 

# Now, for each row 
#  1. sort the Var1 and Var2, 
#  2. combine the sorted vars, and 
#  3. convert them back into a factor 

df$sortcomb <- as.factor(apply(df[,1:2], 1, function(x) paste(sort(x), collapse=", "))) 

table(df$sortcomb) # then use table as per normal 

ddply(df, .(sortcomb), summarize, count=length(sortcomb)) # or ddply 
+0

完美的作品!感謝您的耐心等待。 – LFoos24 2013-02-28 22:39:44

+0

如果每個訂單有兩個以上的物品,我想要統計兩個隨機物品一起訂購,那麼情況如何?我無法想出一種方法來建立你的答案。 – 2016-12-06 15:43:22

4

table()功能是在這裏幫助:

with(t1, table(pc)) ## or equivalently table(t1$pc) 

這是假定pc是因子變量,你想要統計出現次數。 (如果它不是一個因素,它會被強制爲一個。)

+0

感謝您的快速回復。然而當使用 >(t1,table(pc))時:我得到 ,pc.3 =洋蔥圈菠蘿切達漢堡,pc.4 =菠蘿切達漢堡菠蘿切達漢堡,pc.5 =洋蔥圈洋蔥圈, pc.6 =菠蘿切達漢堡洋蔥圈,等 – LFoos24 2013-02-26 21:06:02

+0

把所有這些粘在一起並不是一個好主意。我們如何從計算機上得知「洋蔥圈」是一回事,而不是兩個:「洋蔥」和「戒指」。將所有菜單項分開保存,然後再比較這些組合會更好。 – 2013-02-26 21:10:33

+0

我最初把它們當作兩個單獨的變量,但我有問題將它們按這些變量的組合進行分組,這就是我將它們粘貼到一個單獨的字段中,我可以將它們分組和計數的一個字段。有沒有一種基於組合的組合方式? (我更熟悉SQL,所以我正在考慮沿着GROUP BY Var1,Var2的方向)。很顯然,我是R的新手,所以我對這一切的誤解表示歉意。我將在上面修改以反映分開的項目。 – LFoos24 2013-02-26 21:27:07