我正在尝试在excel中复制“ AverageIfs”函数,但经过几个小时的反复讨论,我找不到直接适用于我的问题的解决方案。我有“年”,“队”,“周”和“分数”列,并且我想创建另一个功能,该功能采用当前周之前几周中给定年份中给定团队的平均得分。因此数据框看起来像这样。
df.scores <- data.frame(Year = c(rep(2017, 5), rep(2018, 5)), Team = c(rep("A", 10), rep("B", 10)), Week = rep(c(1:4, 6), 4), Score = 1:20)
df.scores
Year Team Week Score
<dbl> <fctr> <int> <int>
2017 A 1 1
2017 A 2 2
2017 A 3 3
2017 A 4 4
2017 A 6 5
2018 A 1 6
2018 A 2 7
2018 A 3 8
2018 A 4 9
2018 A 6 10
2017 B 1 11
2017 B 2 12
2017 B 3 13
2017 B 4 14
2017 B 6 15
2018 B 1 16
2018 B 2 17
2018 B 3 18
2018 B 4 19
2018 B 6 20
如果年=观察年,团队=观察队,并且周<观察周,我想获得平均值。
例如,如果年份= 2017,团队= B,星期= 3,则我想取第11和12行的平均值
我一直在研究dplyr软件包,但我仍然很陌生。我还尝试制作子集并以此为基础得出平均值,但是它有点太混乱了。 我用dplyr尝试了以下代码:
df.scores %>% group_by(Team, Year, Week) %>% summarise(Avg.score = mean(Score))
但是,这不包括我想纳入的第n-1周的分数。
我不知道如何根据观察行的值进行过滤,而我看到的所有其他问题都是按类别变量而不是数字变量分组的。任何帮助我将不胜感激,因为我已经为此花了几个小时不停地旋转!
编辑:这与累计平均值略有不同,因为我试图获取以前周的平均值,而不仅仅是当前周。我认为这些答案将我引向正确的方向。
第1周实质上将过时,因为之前没有几周可以平均。这是我根据当前答案得到的。这仍然不只是将前几周的平均值作为最初的目标。
library(data.table)
df <- data.table(df.scores)
df[df$Week > 1 ,x:=cumsum(Score)/(Week),by=list(Year,Team)]
df
Year Team Week Score x
<dbl> <fctr> <int> <int> <dbl>
2017 A 1 1 NA
2017 A 2 2 1.000000
2017 A 3 3 1.666667
2017 A 4 4 2.250000
2017 A 5 5 2.800000
我将继续努力以寻求解决方案,任何其他答复领域也将不胜感激!
编辑2:我应该提到实际的“周数”不是按顺序排列的,因此累加和并不总是有效的,我调整了数据集以反映这一点。