r - dplyr在r中的多列分组?
问题描述
有一些看起来像这样的NBA数据 -
>head(rebs)
game_id a1 a2 a3 a4 a5 h1 h2 h3 h4
1 21800001 Dario Saric Robert Covington Joel Embiid Markelle Fultz Ben Simmons Jayson Tatum Gordon Hayward Al Horford Jaylen Brown
2 21800001 Dario Saric Robert Covington Joel Embiid Markelle Fultz Ben Simmons Jayson Tatum Gordon Hayward Al Horford Jaylen Brown
3 21800001 Dario Saric Robert Covington Joel Embiid Markelle Fultz Ben Simmons Jayson Tatum Gordon Hayward Al Horford Jaylen Brown
4 21800001 Dario Saric Robert Covington Joel Embiid Markelle Fultz Ben Simmons Jayson Tatum Gordon Hayward Al Horford Jaylen Brown
5 21800001 Dario Saric Robert Covington Joel Embiid Markelle Fultz Ben Simmons Jayson Tatum Gordon Hayward Al Horford Jaylen Brown
6 21800001 Dario Saric Robert Covington Joel Embiid Markelle Fultz Ben Simmons Jayson Tatum Gordon Hayward Al Horford Jaylen Brown
h5 player team event_type type reb
1 Kyrie Irving start of period start of period 0
2 Kyrie Irving Al Horford PHI jump ball jump ball 0
3 Kyrie Irving Robert Covington PHI miss Jump Shot 0
4 Kyrie Irving rebound team rebound 0
5 Kyrie Irving Jayson Tatum BOS miss Jump Shot 0
6 Kyrie Irving Dario Saric PHI rebound rebound defensive 1
game_id 是正在玩的游戏的 id。有一个完整的赛季数据,所以这组中有很多不同的游戏。
这是NBA关于比赛级别的数据。a1:a5 是目前在场的客队球员,h1:h5 是目前在场的主队球员。
player 是在该行中进行相关比赛的球员的姓名
team 是进行该行中描述的相关比赛的球员所在的球队
reb 是二进制数,1 表示反弹,0 表示其他所有值。因此,该数据跟踪的第 6 场比赛是达里奥·萨里奇(费城)的反弹。
我想找出每个球员在场时的篮板数,按比赛级别分组。使这变得困难的一件事是,在整个数据集中,玩家将在整个 a1:h5 中移动,即在第一场比赛中,Dario Saric 后来被列在 a4 和 a5 下。所以,基本上是随机的,球员在场上时会被列在 a1-h5 阵容中(除了客队都是 a1:5,主队是 h1:5)。
以下是我过去按每场比赛分组的球员篮板:
library(dplyr)
rebs %>%
group_by(game_id, player) %>%
summarize(rebs = sum(reb))
不过,我不确定如何计算每个球员在场时球队的篮板数。例如。在第 6 场比赛示例中,我希望将其计入目前在场的所有 5 名费城球员,而不仅仅是达里奥·萨里奇。
尝试使用 dplyr 来执行此操作,但不确定是否可行。我正在尝试使用 group_by(game_id, team),然后在 a1:h5 上执行 %in%,但没有任何点击。非常感谢任何帮助!
解决方案
使用tidyverse
您可以尝试以下操作。这可能不是最有效的方法。
reb == 1
如果只对查看反弹数据感兴趣,则首先会过滤,而忽略其余可用的玩法。
然后将为每个篮板球分配一个编号。
您可以pivot_longer
将每场比赛的球员姓名以长格式放在地板上。这也会将您的“主场”与“客场”球员分开,因此您可以将功劳归于同一支球队的球员。也许你可以使用team
,虽然这在其他戏剧中是缺失的。
如果你group_by
game_id
,主客场,以及出场次数,你可以统计队友篮板,检查篮板的球员是否是%in%
其他球员(分享主客场值)。
然后你可以将group_by
每个团队的球员和这些篮板相加。
library(tidyverse)
rebs %>%
filter(reb == 1) %>%
mutate(play_number = row_number()) %>%
pivot_longer(a1:h5, names_to = c("home_away", "num"), values_to = "team_player", names_pattern = "(a|h)(\\d)") %>%
group_by(game_id, home_away, play_number) %>%
mutate(teammate_reb = ifelse(player %in% team_player, 1, 0)) %>%
group_by(game_id, team_player) %>%
summarise(reb_total = sum(teammate_reb))
推荐阅读
- go - 使用 text/message 和 gotext 读取语言环境失败,可能错误地导入其他 go 文件?
- laravel - Laravel - 将 TailwindCSS 样式的视图输出为 PDF
- android - 使用带有底部导航的 Android 导航组件时检测选项卡更改
- azure-devops-rest-api - 从测试外部链接和外部链接 ArtifactURI 中查找测试结果 URL
- javascript - javascript:如何将字符串替换保存在另一个字符串中?
- python - Raid alert catch python脚本需要添加Nagios逻辑
- python - 如何使用切片提取列表中的部分项目?
- assembly - 如何在汇编编程语言中分配位域 - NASM
- julia - 使用 Turing.jl 对 AR(2) 进程进行采样时出现 TypeError
- python - Jenkins python脚本没有运行