【问题标题】:How should I approach counting wins per team over a series of matches in R?在 R 中的一系列比赛中,我应该如何计算每支球队的胜利?
【发布时间】:2015-12-09 00:24:04
【问题描述】:

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

我有一个类似这样结构的数据框,有很多对团队在多轮中每轮进行多场比赛。我想要整个赛季每支球队的胜负数和平局数(= 整个数据框)。

我想到了两种方法,但似乎都不对:

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

  2. 或者,我可以使用dplyr 函数按轮分组,并在轮内进行比较。但那有什么功能呢?我不想使用像 dplyr 这样的汇总函数似乎很自然地可以使用,因为我想生成一个列来告诉我几个单元格中的每一个是否都是胜利。

有什么建议吗?谢谢!

【问题讨论】:

    标签: r loops dplyr


    【解决方案1】:

    这是我的尝试。我最初使用melt() 以长格式输出数据。然后,我在group_by() 中创建了一个组变量。然后,我使用value更改了每对的顺序,也就是比赛中的分数。在mutate() 中,当两个值(两个分数)相等时,我分配了“tie”。否则,我将“赢”和“输”分配给每一对,因为赢家排在第一位。如果您想要宽格式,可以使用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
    

    【讨论】:

      【解决方案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 是赢,1s 是输,1.5s 是平局。您可以使用factor() 来标记它们。

      【讨论】:

        【解决方案3】:

        这是另一个 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-21
          • 1970-01-01
          • 1970-01-01
          • 2021-07-18
          相关资源
          最近更新 更多