按组累计平均值

时间:2014-10-14 15:57:59

标签: r

我想在每个索引的下表中按名称计算尾随平均值GPA。 例如,在索引9处,我希望从索引3,6,9得到C的平均GPA,同样对于A和B。在索引6处我希望从索引3和6获得C的GPA。单独使用tapply赢得&# 39;解决我的问题,因为我想要每行的值。

干净的方法是什么?

Index Name GPA
1     A    5
2     B    6
3     C    7
4     A    5
5     B    6
6     C    6
7     A    7
8     B    6
9     C    3

2 个答案:

答案 0 :(得分:3)

Minimally reproducible example

g <- data.frame(Name=rep(c("A","B","C"),3),
                GPA=c(5,6,7,5,6,6,7,6,3))

对于累积平均值,我只会将cumsum()seq_along()限制为具有相同名称的行。

for(i in unique(g$Name)){
  gpa <- g$GPA[g$Name==i]
  g$cum_avg[g$Name==i] <- cumsum(gpa)/seq_along(gpa)
}
g

产地:

  Name GPA  cum_avg
1    A   5 5.000000
2    B   6 6.000000
3    C   7 7.000000
4    A   5 5.000000
5    B   6 6.000000
6    C   6 6.500000
7    A   7 5.666667
8    B   6 6.000000
9    C   3 5.333333

答案 1 :(得分:0)

使用dplyr

g <- data.frame(Name=rep(c("A","B","C"),3),
            GPA=c(5,6,7,5,6,6,7,6,3))

g %>%
group_by(Name) %>%
mutate(cumu = lag(cummean(GPA), n = 0))

输出:

Source: local data frame [9 x 3]
Groups: Name [3]

Name   GPA     cumu
<fctr> <dbl>    <dbl>
1      A     5 5.000000
2      B     6 6.000000
3      C     7 7.000000
4      A     5 5.000000 
5      B     6 6.000000
6      C     6 6.500000
7      A     7 5.666667
8      B     6 6.000000
9      C     3 5.333333
相关问题