在R中计算列表出现的次数

4
我有一个包含大约10万个订单商品组合的清单,我将它们粘贴到了一列中以便统计每种组合出现的次数。
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')"

我认为这是因为我试图按字母值“分组”。我也尝试过使用类似问题的答案中提到的tapply和recast,但没有成功。如何获取这些组合的计数?以下是一些单独列出的样本项目(再次对格式问题表示歉意)。
                   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
2个回答

4

table()函数在这里非常有帮助:

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

这里假设pc是一个您想要统计出现次数的因子变量。(如果它不是因子变量,它将被强制转换为因子变量。)

感谢您的快速回复。然而,当使用“with(t1, table(pc))”时,我得到了以下结果:pc.3 = 洋葱圈菠萝切达汉堡,pc.4 = 菠萝切达汉堡菠萝切达汉堡,pc.5 = 洋葱圈洋葱圈,pc.6 = 菠萝切达汉堡洋葱圈等。 - LFoos24
把所有东西粘在一起并不是一个好主意。我们如何在计算机上知道“洋葱圈”是一件事而不是两个:“洋葱”和“圈”。最好将所有菜单项分开,然后比较这些组合。 - Gavin Simpson
我最初将它们作为两个单独的变量,但是在尝试按这些变量的组合进行分组时遇到了问题,这促使我将它们粘贴到一个单一字段中,以便能够进行分组和计数。是否有一种基于组合的分组方法?(我更熟悉SQL,所以我想到了类似于GROUP BY Var1,Var2的方法)。显然,我对R还相当新手,因此如果有任何误解,请见谅。我将修改上面的内容以反映分开的项目。 - LFoos24
回到将变量拆分并使用您的表建议,我得到了每个组合的矩阵计数,但是在这种格式下,如果没有丢失dimnames,我无法对前几个出现次数进行子集操作(这最终是我想要实现的)。 - LFoos24

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

如果一个订单中有超过2个商品,我想要计算其中任意两个商品一起被订购的次数怎么办?我无法想到如何在您的答案基础上进行扩展。 - FrançoisD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接