首页 > 解决方案 > 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%,但没有任何点击。非常感谢任何帮助!

标签: r

解决方案


使用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))

推荐阅读