创建一个包含 R 中出现次数的列

tko*_*_dk 5 r

我正在尝试向现有数据框添加一列,以便该列定义每个用户购买的不同产品的数量。一个玩具示例是

Customer    Product
1           Chocolate
1           Candy
1           Soda
2           Chocolate
2           Chocolate
2           Chocolate
3           Insulin
3           Candy
Run Code Online (Sandbox Code Playgroud)

输出应该在哪里

Customer    Product     #Products
1           Chocolate   3
1           Candy       3
1           Soda        3
2           Chocolate   1
2           Chocolate   1
2           Chocolate   1
3           Insulin     2
3           Candy       2
Run Code Online (Sandbox Code Playgroud)

我想在没有 for 循环的情况下执行此操作,因为我有数百万行,并且这将花费很长时间。我使用了 data.table 和其他方法来获取每个客户的产品数量,但我不知道如何轻松地将其作为列添加到现有数据框中。

提前致谢!

A5C*_*2T1 3

在基础 RI 中会建议ave

within(mydf, {
    count = ave(Product, Customer, FUN = function(x) length(unique(x)))
})
##   Customer   Product count
## 1        1 Chocolate     3
## 2        1     Candy     3
## 3        1      Soda     3
## 4        2 Chocolate     1
## 5        2 Chocolate     1
## 6        2 Chocolate     1
## 7        3   Insulin     2
## 8        3     Candy     2
Run Code Online (Sandbox Code Playgroud)

您还可以尝试“data.table”包:

library(data.table)
as.data.table(mydf)[, count := length(unique(Product)), by = Customer][]
##    Customer   Product count
## 1:        1 Chocolate     3
## 2:        1     Candy     3
## 3:        1      Soda     3
## 4:        2 Chocolate     1
## 5:        2 Chocolate     1
## 6:        2 Chocolate     1
## 7:        3   Insulin     2
## 8:        3     Candy     2
Run Code Online (Sandbox Code Playgroud)