2013-02-26 71 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