使用R,我如何获取球员和分数列表,并创建一个团队和每场比赛前五名球员分数的数据框架



我有一个所有NBA球员、他们的球队和他们每场比赛的得分的数据框架。我想创建一个新的数据框架,将球队名称列为第一列,接下来的五列是他们五名领先得分手的每场比赛得分。

所以。。。(虚构数字)

ATL 17.2 14.3 12.2 10.2 9.4

我正在努力解决可能让我到达那里的问题。我想我需要为每支球队创建第一个数据帧的子集(列出他们的每个得分手),然后对所有30个数据帧进行排序,然后使用[0:4]将每场比赛得分列中的前5个值移动到一个新的数据帧中。

有没有一种简单的方法可以使用for循环来创建所有30个数据帧?也许如果我为每个球队的名字创建一个列表,然后做一些类似的事情。。。。

for i in list:
    create data frame i from ALLPLAYERS[TEAM = i]

然后我可以使用其他排序方法对它们进行排序,并将它们添加到最终的数据帧中。

对不起,我知道上面的"代码"部分并不是真正的代码,这只是我的想法,我需要找到确切的措辞。

这可以使用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]

我每场比赛都使用不切实际的分数,但这让我很容易看到发生了什么。

以下是一种策略(前两名得分者)的示例代码:

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 

使用包library(dplyr)library(tidyr),以及DaveTurek生成的伪数据,这里有一个循序渐进的解决方案:

生成虚假数据:

nba=data.frame(player=1:100,team=rep(LETTERS[1:10],each=10),ppg=1:100)

通过分组、排序和切片,只选择每支球队的前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中错误所必需的):

top_scorers <- as.data.frame(top_scorers %>% select(-player))

将数据帧扩展为所需的宽格式,而不是当前的长格式:

result <- spread(top_scorers,scoreRank,ppg)

最新更新