【问题标题】:How can I count how many different teams a player was on when playing in MLB All-Star games?我如何计算一名球员在参加 MLB 全明星赛时效力过多少支不同的球队?
【发布时间】:2020-10-04 04:23:50
【问题描述】:

我有一个棒球运动员名单 (playerID)。我想知道他们在全明星赛中参加了多少支不同的球队。例如,输入中的 aaronha01 在五次全明星赛中为同一支球队效力,因此他的 NumTms 为 1。输出图像显示了我希望输出的格式。

代码 我试过这段代码,但没有用。我更喜欢使用 dplyr 的答案。

df %>% group_by(playerID) %>% select(playerID, teamID) %>% mutate(teams = n_distinct(playerID)) %>% arrange(desc(teams))

输入

structure(list(playerID = c("aaronha01", "aaronha01", "aaronha01", 
"aaronha01", "aaronha01", "aasedo01", "abreubo01", "abreubo01", 
"abreujo02", "abreujo02", "abreujo02", "acunaro01", "adamsac01", 
"adcocjo01", "adcocjo01", "ageeto01", "ageeto01", "aguilje01", 
"aguilri01", "aguilri01", "aguilri01", "aguirha01", "albieoz01", 
"alcansa01", "alexado01", "alfoned01", "allendi01", "allendi01", 
"allendi01", "allendi01", "allendi01", "allendi01", "allendi01"
), teamID = c("MLN", "MLN", "MLN", "MLN", "MLN", "BAL", "PHI", 
"PHI", "CHA", "NYN", "ATL", "ATL", "NY1", "MLN", "DET", "CHA", 
"CHA", "MIL", "MIN", "MIN", "MIN", "DET", "ATL", "MIA", "DET", 
"NYN", "PHI", "PHI", "PHI", "SLN", "CHA", "CHA", "CHA"), lgID = c("NL", 
"NL", "NL", "NL", "NL", "AL", "NL", "NL", "AL", "AL", "AL", "NL", 
"NL", "NL", "NL", "AL", "AL", "NL", "AL", "AL", "AL", "AL", "NL", 
"NL", "AL", "NL", "NL", "NL", "NL", "NL", "AL", "AL", "AL")), row.names = c(NA, 
-33L), class = c("tbl_df", "tbl", "data.frame"))

我希望输出如何显示:

我曾尝试根据 How to add count of unique values by group to R data.frame 的 stackoverflow 帖子进行此操作,但没有成功。

【问题讨论】:

  • 您要查找的是aggregate(NumTms~playerID,cbind(unique(df),NumTms = 1),length),它无法复制到您想要的表中。例如。如果一名球员在两个联赛中怎么办?你应该输出哪个联赛?另外,您应该输出球员效力的众多球队中的哪支球队?在tidyverse:distinct(df)%>%group_by(playerID)%>%summarise(NumTms = n())

标签: r dplyr


【解决方案1】:

您非常接近,您只需在计算团队之前将团队子集为lgID == "AL"

df %>%
  group_by(playerID) %>%
  mutate(NumTms = n_distinct(teamID[lgID == "AL"])) %>%
  arrange(desc(NumTms))
# A tibble: 33 x 4
# Groups:   playerID [16]
   playerID  teamID lgID  NumTms
   <chr>     <chr>  <chr>  <int>
 1 abreujo02 CHA    AL         3
 2 abreujo02 NYN    AL         3
 3 abreujo02 ATL    AL         3
 4 aasedo01  BAL    AL         1
 5 ageeto01  CHA    AL         1
 6 ageeto01  CHA    AL         1
 7 aguilri01 MIN    AL         1
 8 aguilri01 MIN    AL         1
 9 aguilri01 MIN    AL         1
10 aguirha01 DET    AL         1

【讨论】:

  • 怎样才能让每个playerID只出现一次?
【解决方案2】:

这是一种使用dplyr::summarise() 为每个playerID 创建一行的方法。

library(dplyr)
df %>% 
     group_by(playerID) %>% filter(lgID == "AL") %>%
     summarise(.,numTeams = n_distinct(teamID))

...和输出:

  playerID  numTeams
  <chr>        <int>
1 aasedo01         1
2 abreujo02        3
3 ageeto01         1
4 aguilri01        1
5 aguirha01        1
6 alexado01        1
7 allendi01        1

如果我们将lgID 添加到group_by(),我们可以计算playerID 参加的每个联赛中的球队数量。

df %>% 
     group_by(playerID,lgID) %>% 
     summarise(.,numTeams = n_distinct(teamID))

...和输出:

   playerID  lgID  numTeams
   <chr>     <chr>    <int>
 1 aaronha01 NL           1
 2 aasedo01  AL           1
 3 abreubo01 NL           1
 4 abreujo02 AL           3
 5 acunaro01 NL           1
 6 adamsac01 NL           1
 7 adcocjo01 NL           2
 8 ageeto01  AL           1
 9 aguilje01 NL           1
10 aguilri01 AL           1
11 aguirha01 AL           1
12 albieoz01 NL           1
13 alcansa01 NL           1
14 alexado01 AL           1
15 alfoned01 NL           1
16 allendi01 AL           1
17 allendi01 NL           2

【讨论】:

  • Summarize 函数开头的点有什么作用?
  • @Metsfan - 点表示法引用了前面步骤中管道中的数据帧。详情见help for summarise()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多