【问题标题】:Create a column with a count of occurrences in R [duplicate]在R中创建一个包含出现次数的列[重复]
【发布时间】:2015-08-16 00:10:17
【问题描述】:

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

Customer    Product
1           Chocolate
1           Candy
1           Soda
2           Chocolate
2           Chocolate
2           Chocolate
3           Insulin
3           Candy

输出应该在哪里

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

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

提前致谢!

【问题讨论】:

  • HTML vignettes开始使用data.table..
  • 谢谢@Arun - 我一直在寻找类似的东西!

标签: r


【解决方案1】:

在基础 R 中,我建议 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

你也可以试试“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

【讨论】:

  • 美丽的阿难!我一直试图让它与 data.table 一起工作(这对我来说是全新的),因为它是如此之快,但我无法理解获取所有变量列以及结果的语法。你能解释一下你用过的语法吗?
  • @tkoz_dk,我只是稍微编辑了代码。现在更有意义了吗? := 是通过引用赋值,最后的[] 只是打印输出。
  • 是的,现在我明白了。非常感谢您的帮助!
  • @VigneshKalai,“data.table”。
  • @VigneshKalai,请看??":="以了解引用赋值,?ave了解ave函数。基本上ave 会在一组由另一组值分组的值上运行一个函数。
【解决方案2】:

你应该擅长这样的事情(假设 df 是你的数据):

df.agr=aggregate(Product~Customer,data=df, FUN=function(x) length(unique(x)))
df=cbind(df, Count=apply(df, MARGIN=1, FUN=function(r) df.agr$Product[match(r[1],df.agr$Customer)]))

它不会很快,但肯定比现在快。

【讨论】:

  • 感谢您的回答。我想它几乎就在那里 - 我在最初的问题中没有足够清楚地表达出来:代码让我计算了客户购买的物品数量,我想要计算他/她的不同物品的数量已购买 - 请参阅输出示例进行说明。
  • 它就像一个魅力!谢谢!
【解决方案3】:

我将plyr 用于涉及拆分-应用-组合的任何事情。在这种情况下,我们将数据按Customer 拆分,并对Product 应用长度唯一函数,然后合并结果

require(plyr)
ddply(df, .(Customer), transform, num.products = length(unique(Product)))

  Customer   Product num.products
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

奖励,以防您希望从中获得更小的摘要数据框。

ddply(df, .(Customer), summarize, num.products = length(unique(Product)))

  Customer num.products
1        1            3
2        2            1
3        3            2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多