R cumsum 分组

R cumsum groupby

我在 R 中有以下代码

set.seed(12048)
name <- sample(letters[1:3], 10, replace=T)
df <- data.frame(name, stringsAsFactors = F)
df$score <- sample(0:1, nrow(df), replace=T)
df$rank <- as.numeric(ave(df$name, df$name, FUN=seq_along))
v <- by(df$score, df$name, cumsum)

这会产生以下结果 table

   name score rank
1     b     0    1
2     a     1    1
3     a     1    2
4     c     1    1
5     c     1    2
6     a     0    3
7     a     1    4
8     b     0    2
9     c     1    3
10    c     1    4

我现在正在尝试像这样制作一个 table,其中 cumsum 列是每个 'name' 'score' 列中 1 的计数,如下所示:

   name score rank  cumsum
1     b     0    1       0
2     a     1    1       1
3     a     1    2       2
4     c     1    1       1
5     c     1    2       2
6     a     0    3       2
7     a     1    4       3
8     b     0    2       0
9     c     1    3       2
10    c     1    4       3

我试过了,我正确地得到了 cumsums,但我不知道如何合并回 'order'

中的数据框 df
> dftable <- as.data.table(df)
> dfn <- dftable[,list(cumsum = cumsum(score)),by=list(name)]
> dfn
    name cumsum
 1:    b      0
 2:    b      0
 3:    a      1
 4:    a      2
 5:    a      2
 6:    a      3
 7:    c      1
 8:    c      2
 9:    c      3
10:    c      4

非常感谢任何帮助。

我们可以使用 mutatedplyr

 library(dplyr)
 df %>% 
    group_by(name) %>%
    mutate(cumsum = cumsum(score))

如果我们想使用 base R,一个选项是 ave,如评论中提到的@Frank

df$cumsum <- with(df, ave(score, name, FUN = cumsum))

注意:最好不要用函数名来命名对象,即 cumsum 可以是 Cumsum1 或其他名称,以免将来出现问题