我想在每个索引的下表中按名称计算尾随平均值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
答案 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