r - 对前 N 个观测值求和的函数
问题描述
我想找到一种有效的方法来计算一个球队在前 N 场比赛中获得的分数(不包括当前比赛中的分数),每个模拟 ID、球队和赛季的组合。如果到目前为止,一支球队参加的比赛少于 N 场,则该函数应返回 NA。
一个简化的数据集:
match_ID | 季节 | 模拟_ID | 主队 | 团队 | 匹配结果 | team_points |
---|---|---|---|---|---|---|
1 | 2015-2016 | 1 | 真的 | 曼联 | 主场获胜 | 3 |
1 | 2015-2016 | 2 | 真的 | 曼联 | 画 | 1 |
1 | 2015-2016 | 3 | 真的 | 曼联 | 主场获胜 | 3 |
1 | 2015-2016 | 1 | 错误的 | 托特纳姆热刺 | 主场获胜 | 0 |
1 | 2015-2016 | 2 | 错误的 | 托特纳姆热刺 | 主场获胜 | 0 |
1 | 2015-2016 | 3 | 错误的 | 托特纳姆热刺 | 客场胜利 | 3 |
2 | 2015-2016 | 1 | 真的 | 莱斯特 | 主场获胜 | 3 |
2 | 2015-2016 | 2 | 真的 | 莱斯特 | 主场获胜 | 3 |
2 | 2015-2016 | 3 | 真的 | 莱斯特 | 客场胜利 | 0 |
2 | 2015-2016 | 1 | 错误的 | 桑德兰 | 画 | 1 |
预期的输出是数据中的一个额外列,称为“accumulated_team_points”,它返回该团队、赛季和模拟 ID 的最后 N 场比赛中的分数。
我似乎无法找到一种方法来做到这一点。
解决方案
这里需要两个操作:分组(我将使用 演示dplyr
)和滚动窗口求和(我将使用zoo
)。
此外,您的数据有点太稀疏,无法按所有三个分组非常棒,所以这次team, season, simulation_ID
我将只显示分组。team
对于较大的数据,请替换group_by(team)
为group_by(team, season, simulation_ID)
.
library(dplyr)
k <- 3 # window size
dat %>%
group_by(team) %>%
mutate(accumulated_team_points = zoo::rollapply(team_points, k, FUN = sum, align = "right", fill = NA)) %>%
ungroup()
# # A tibble: 10 x 8
# match_ID season simulation_ID home_team team match_result team_points accumulated_team_points
# <int> <chr> <int> <lgl> <chr> <chr> <int> <int>
# 1 1 2015-2016 1 TRUE Manchester Utd Home win 3 NA
# 2 1 2015-2016 2 TRUE Manchester Utd Draw 1 NA
# 3 1 2015-2016 3 TRUE Manchester Utd Home win 3 7
# 4 1 2015-2016 1 FALSE Tottenham Home win 0 NA
# 5 1 2015-2016 2 FALSE Tottenham Home win 0 NA
# 6 1 2015-2016 3 FALSE Tottenham Away win 3 3
# 7 2 2015-2016 1 TRUE Leicester Home win 3 NA
# 8 2 2015-2016 2 TRUE Leicester Home win 3 NA
# 9 2 2015-2016 3 TRUE Leicester Away win 0 6
# 10 2 2015-2016 1 FALSE Sunderland Draw 1 NA
这默认NA
用于窗口中的第一个k-1
实例,这通常是一个理智且可辩护的默认设置。但是,如果您想对部分和进行求和,则替换fill=NA
为partial=TRUE
:
dat %>%
group_by(team) %>%
mutate(accumulated_team_points = zoo::rollapply(team_points, k, FUN = sum, align = "right", partial = TRUE)) %>%
ungroup()
# # A tibble: 10 x 8
# match_ID season simulation_ID home_team team match_result team_points accumulated_team_points
# <int> <chr> <int> <lgl> <chr> <chr> <int> <int>
# 1 1 2015-2016 1 TRUE Manchester Utd Home win 3 3
# 2 1 2015-2016 2 TRUE Manchester Utd Draw 1 4
# 3 1 2015-2016 3 TRUE Manchester Utd Home win 3 7
# 4 1 2015-2016 1 FALSE Tottenham Home win 0 0
# 5 1 2015-2016 2 FALSE Tottenham Home win 0 0
# 6 1 2015-2016 3 FALSE Tottenham Away win 3 3
# 7 2 2015-2016 1 TRUE Leicester Home win 3 3
# 8 2 2015-2016 2 TRUE Leicester Home win 3 6
# 9 2 2015-2016 3 TRUE Leicester Away win 0 6
# 10 2 2015-2016 1 FALSE Sunderland Draw 1 1
仅供参考:我假设数据是预先订购的。
数据
dat <- structure(list(match_ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), season = c("2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016", "2015-2016"), simulation_ID = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L), home_team = c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE), team = c("Manchester Utd", "Manchester Utd", "Manchester Utd", "Tottenham", "Tottenham", "Tottenham", "Leicester", "Leicester", "Leicester", "Sunderland"), match_result = c("Home win", "Draw", "Home win", "Home win", "Home win", "Away win", "Home win", "Home win", "Away win", "Draw"), team_points = c(3L, 1L, 3L, 0L, 0L, 3L, 3L, 3L, 0L, 1L)), class = "data.frame", row.names = c(NA, -10L))
推荐阅读
- bash - 为什么使用 += 在 bash 中存储命令的退出状态?
- java - 如何使用 Mockito 通过注解注入模拟集合
- active-directory - 将 Microsoft Bot v4 与 ServiceNow 集成
- ietf-netmod-yang - 不可读 - YANG
- pdftron - PDFTRON 中的“此文档没有页面”错误
- python - 使用子进程打开一个exe文件并与之交互
- java - 如何将括号括在百分比周围?
- python - 如何在 Bert 序列分类中使用大于零的批量大小
- javascript - 刷新页面后如何保持复选框状态
- javascript - Firebase admin SDK FCM 错误 需要主题、令牌或条件之一