在 R 中如何逐行获取向量的百分比

In R how to get a percentage of a vector row by row

我有一个包含两列的 data.table。我想逐行获得一个由 sub.

重置的滚动百分比
library(data.table)
sub <-c("A","A","A","A","B","B","B","B","C","C","C","C")
n<-c(0,1,1,1,0,1,0,1,0,1,0,1)

df <- data.table(sub,n )

    sub n
 1:   A 0
 2:   A 1
 3:   A 1
 4:   A 1
 5:   B 0
 6:   B 1
 7:   B 0
 8:   B 1
 9:   C 0
10:   C 1
11:   C 0
12:   C 1

我需要的样子:

    sub n rolling_percentage
 1:   A 0               0.00
 2:   A 1               0.50
 3:   A 1               0.66
 4:   A 1               0.75
 5:   B 0               0.00
 6:   B 1               0.50
 7:   B 0               0.33
 8:   B 1               0.50
 9:   C 0               0.00
10:   C 1               0.50
11:   C 0               0.33
12:   C 1               0.50

我尝试过的: df$rolling_percentage= 100*cumsum(df$n)/sum(df1$n) 但这给了我这个

    sub n rolling_percentage
 1:   A 0            0.00000
 2:   A 1           14.28571
 3:   A 1           28.57143
 4:   A 1           42.85714
 5:   B 0           42.85714
 6:   B 1           57.14286
 7:   B 0           57.14286
 8:   B 1           71.42857
 9:   C 0           71.42857
10:   C 1           85.71429
11:   C 0           85.71429
12:   C 1          100.00000

每次 df$sub 更改时我都需要重置它。

可以将n的累计和除以组内的行号

library(data.table)
df[, rolling_percentage := cumsum(n)/seq_len(.N), sub]
df

#    sub n rolling_percentage
# 1:   A 0               0.00
# 2:   A 1               0.50
# 3:   A 1               0.67
# 4:   A 1               0.75
# 5:   B 0               0.00
# 6:   B 1               0.50
# 7:   B 0               0.33
# 8:   B 1               0.50
# 9:   C 0               0.00
#10:   C 1               0.50
#11:   C 0               0.33
#12:   C 1               0.50

dplyr 有一个特殊功能 cummean 用于此目的。

library(dplyr)
df %>% group_by(sub) %>% mutate(rolling_percentage = cummean(n))