使用 R,我如何获取球员和积分列表并创建球队数据框和每场比赛前五名球员积分
Using R, how do I take a list of players and points and create a dataframe of teams and top five player pts per game
我有所有 NBA 球员、他们的球队和他们每场比赛得分的数据框。我想创建一个新的数据框,将球队名称列为第一列,接下来的五列是他们五个领先得分手每场比赛的得分。
所以...(编造数字)
ATL 17.2 14.3 12.2 10.2 9.4
我正在努力解决可能让我到达那里的问题。我在想我需要为每个团队创建第一个数据框的子集(列出他们的每个得分手),然后对所有 30 个数据框进行排序,然后将每场比赛分列中的前 5 个值移动到一个新的数据框中使用[0:4].
有没有一种简单的方法可以使用 for 循环来创建所有 30 个数据框?也许如果我为每个团队名称创建一个列表,然后执行类似...
for i in list:
create data frame i from ALLPLAYERS[TEAM = i]
然后我可以使用其他排序方式对它们进行排序并将它们添加到最终数据框中。
抱歉,我知道上面的 "code" 部分并不是真正的代码,这只是我的想法,我需要找到确切的措辞。
这是一种策略(前 2 名得分手)的一些示例代码:
set.seed(123)
df <- data.frame(team = LETTERS[1:2], player = replicate(8, paste0(sample(letters, 5, T), collapse = "")), score = sample(1:20, 8, T))
aggregate(score~team, data = df[order(-df$score), ], head, 2)
# team score.1 score.2
# 1 A 9 5
# 2 B 10 9
这可以使用 data.table
。
library(data.table)
nba = data.table(player = 1:100, team = rep(LETTERS[1:10],
each = 10), ppg = 1:100)
nba[, as.list(tail(sort(ppg), 5)), by = team]
我使用不切实际的每场比赛得分,但它可以很容易地看到发生了什么。
使用包 library(dplyr)
和 library(tidyr)
,以及上面由 DaveTurek 生成的假数据,这是一个分步解决方案:
生成虚假数据:
nba=data.frame(player=1:100,team=rep(LETTERS[1:10],each=10),ppg=1:100)
Select 通过分组、排序和切片,仅每队前 5 名得分手:
top_scorers <- nba %>% group_by(team) %>% arrange(-ppg) %>% slice(1:5)
创建一个名为 scoreRank 的新变量,分配他们在团队中的排名,其中 1 是最高得分,5 是第五高得分:
top_scorers %<>% group_by(team) %>% mutate (scoreRank = rank(-ppg))
删除播放器名称列并转换为数据框(后者对于 dplyr 中的 bug 是必需的):
top_scorers <- as.data.frame(top_scorers %>% select(-player))
将数据帧展开为所需的宽格式,而不是当前的长格式:
result <- spread(top_scorers,scoreRank,ppg)
我有所有 NBA 球员、他们的球队和他们每场比赛得分的数据框。我想创建一个新的数据框,将球队名称列为第一列,接下来的五列是他们五个领先得分手每场比赛的得分。
所以...(编造数字)
ATL 17.2 14.3 12.2 10.2 9.4
我正在努力解决可能让我到达那里的问题。我在想我需要为每个团队创建第一个数据框的子集(列出他们的每个得分手),然后对所有 30 个数据框进行排序,然后将每场比赛分列中的前 5 个值移动到一个新的数据框中使用[0:4].
有没有一种简单的方法可以使用 for 循环来创建所有 30 个数据框?也许如果我为每个团队名称创建一个列表,然后执行类似...
for i in list:
create data frame i from ALLPLAYERS[TEAM = i]
然后我可以使用其他排序方式对它们进行排序并将它们添加到最终数据框中。
抱歉,我知道上面的 "code" 部分并不是真正的代码,这只是我的想法,我需要找到确切的措辞。
这是一种策略(前 2 名得分手)的一些示例代码:
set.seed(123)
df <- data.frame(team = LETTERS[1:2], player = replicate(8, paste0(sample(letters, 5, T), collapse = "")), score = sample(1:20, 8, T))
aggregate(score~team, data = df[order(-df$score), ], head, 2)
# team score.1 score.2
# 1 A 9 5
# 2 B 10 9
这可以使用 data.table
。
library(data.table)
nba = data.table(player = 1:100, team = rep(LETTERS[1:10],
each = 10), ppg = 1:100)
nba[, as.list(tail(sort(ppg), 5)), by = team]
我使用不切实际的每场比赛得分,但它可以很容易地看到发生了什么。
使用包 library(dplyr)
和 library(tidyr)
,以及上面由 DaveTurek 生成的假数据,这是一个分步解决方案:
生成虚假数据:
nba=data.frame(player=1:100,team=rep(LETTERS[1:10],each=10),ppg=1:100)
Select 通过分组、排序和切片,仅每队前 5 名得分手:
top_scorers <- nba %>% group_by(team) %>% arrange(-ppg) %>% slice(1:5)
创建一个名为 scoreRank 的新变量,分配他们在团队中的排名,其中 1 是最高得分,5 是第五高得分:
top_scorers %<>% group_by(team) %>% mutate (scoreRank = rank(-ppg))
删除播放器名称列并转换为数据框(后者对于 dplyr 中的 bug 是必需的):
top_scorers <- as.data.frame(top_scorers %>% select(-player))
将数据帧展开为所需的宽格式,而不是当前的长格式:
result <- spread(top_scorers,scoreRank,ppg)