使用dplyr计算组内累计计数

4
我尝试创建一个包含另一列的累计计数的列。
我的数据:
df <- data.frame(brand = c("A","B","C","A","A","B","A","A","B","C"))

这是我期望的输出:

    |Brand |  Count  |
    |:-----|--------:|
    |A     |        1|
    |B     |        1|
    |C     |        1|
    |A     |        2|
    |A     |        3|
    |B     |        2|
    |A     |        4|
    |A     |        5|
    |B     |        3|
    |C     |        2|

我尝试了cumsum函数,但它不接受字符串或因子:

df %>%
  group_by(Brand) %>%
  mutate(Count = cumsum(Brand))

编辑:如能将该解决方案应用于数据库表格(SQL Server),则更佳。

2个回答

6
我们可以使用 rowid 列来创建 'brand' 列。
library(dplyr)
library(data.table)
 df %>%
    mutate(Count = rowid(brand))

或者在按 'brand' 分组后使用 row_number

df %>%
    group_by(brand) %>%
    mutate(Count = row_number())

或者使用data.table

library(data.table)
setDT(df)[, Count := rowid(brand)]

你总是这么快!你有办法让我们在数据库表上做这件事吗?“row_number()”不起作用。 - Shinobi_Atobe
我的数据框中有3百万行。你的第二个解决方案已经运行了15分钟,但还没有输出... - Shinobi_Atobe
@Shinobi_Atobe 在我回答这个问题的时候,数据库部分并没有在问题中提到。 - akrun

1

关于这个问题的更新:

@akrun 提供的第二种解决方案

myDF |>
  group_by(myGroup) |> 
  mutate(Count = row_number())

对我很有效,速度非常快(对于80,000行以上)。虽然不是在数据库上,但对于一些人来说,知道它可以工作并且速度快可能仍然很有用。


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