如何通过R中的一系列比赛来计算每个团队的计数胜利?

时间:2015-12-09 00:24:05

标签: r loops dplyr

我正在寻求关于如何思考和解决这个问题的建议。

我有一个像这样的数据框架,有很多队在多轮比赛中每轮比赛多场比赛。我希望整个赛季(=整个数据框架)计算每支球队的胜负,失误和关系。

enter image description here

我已经想过两种方法,但它们似乎都不正确:

  1. 我可以通过比较两个给定的分数来确定其中一个的赢/输/平局,使用if-then-else函数。但有时候比赛的另一个分数是下面的分数,有时候是上面的分数。因此使用apply函数循环似乎不对。

  2. 或者,我可以使用dplyr函数进行分组,并在回合中进行比较。但后来有什么功能?我不想使用类似dplyr的总结函数似乎自然而然地使用,因为我想生成一个列,告诉我几个单元格中的每一个是否都是胜利。

  3. 请问有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分:2)

这是我的尝试。我最初使用melt()以长格式输出数据。然后,我在group_by()中创建了一个组变量。然后,我使用value更改了每对的顺序,这是匹配中的分数。在mutate()中,当两个值(两个分数)相等时,我分配了“关系”。否则,我为每一对分配了“赢”和“输”,因为获胜者排在第一位。如果您想要宽屏,可以使用dcast()

mydf <- data.frame(round = c("A1", "A1", "A2", "A2"),
                   team = c("Lincoln", "Jefferson", "Washington", "Adams"),
                   match1 = c(3, 2, 5, 0),
                   match2 = c(1, 1, 3, 1),
                   match3 = c(2, 4, 4, 3),
                   stringsAsFactors = FALSE)

melt(mydf, id.vars = c("round", "team"), variable.name = "match") %>%
    group_by(round, match) %>%
    arrange(desc(value)) %>%
    mutate(result = { if(value[1] == value[2]){"ties"}else{
        c("win", "lose")}
    })


#    round       team  match value result
# 1     A1    Lincoln match1     3    win
# 2     A1  Jefferson match1     2   lose
# 3     A1    Lincoln match2     1   ties
# 4     A1  Jefferson match2     1   ties
# 5     A1  Jefferson match3     4    win
# 6     A1    Lincoln match3     2   lose
# 7     A2 Washington match1     5    win
# 8     A2      Adams match1     0   lose
# 9     A2 Washington match2     3    win
# 10    A2      Adams match2     1   lose
# 11    A2 Washington match3     4    win
# 12    A2      Adams match3     3   lose

答案 1 :(得分:2)

您的格式相对于轮次而言相对较长但格式较宽。我会使用排名来查找每个匹配使用sapply的每个匹配的哪个团队,每轮使用ave

sapply(mydf[-1:-2], function(x) ave(x, mydf[1], FUN=rank))
#     match1 match2 match3
#[1,]      2    1.5      1
#[2,]      1    1.5      2
#[3,]      2    2.0      2
#[4,]      1    1.0      1

2s是胜利,1是亏损,1.5s是关系。您可以使用factor()标记它们。

答案 2 :(得分:1)

这是另一个dplyr / tidyr选项

library(dplyr)
library(tidyr)

mydf %>%
  gather(match_number, score, 
         match1:match3) %>%
  group_by(round, match_number) %>%
  mutate(percent_goals =  score / sum(score),
         win = percent_goals > 0.5,
         tie = percent_goals == 0.5,
         lose = percent_goals < 0.5) %>%
  gather(outcome, test, 
         win, tie, lose) %>%
  filter(test) %>%
  count(team, outcome) %>%
  spread(outcome, n, fill = 0)