如何基于R语言体育DataFrame计算各球队平均获胜赔率?
解决方法
首先先构造你提供的原始数据框:
df <- data.frame( HomeTeam = c("Barcelona", "Madrid", "Liverpool", "Madrid", "Liverpool", "Barcelona"), AwayTeam = c("Madrid", "Liverpool", "Barcelona", "Barcelona", "Madrid", "Liverpool"), HomeWin = c(2.30, 8.79, 3.41, 1.38, 1.53, 3.35), Draw = c(3.28, 5.12, 3.34, 5.08, 4.07, 3.62), AwayWin = c(3.27, 1.36, 2.21, 7.92, 6.83, 2.12) )
方法一:Base R实现
无需额外安装包,用基础R函数即可完成:
# 拆分主客场的球队与对应获胜赔率 home_win <- data.frame(Team = df$HomeTeam, WinOdds = df$HomeWin) away_win <- data.frame(Team = df$AwayTeam, WinOdds = df$AwayWin) # 合并所有获胜赔率数据 all_win <- rbind(home_win, away_win) # 按球队分组计算平均赔率,保留两位小数 result <- aggregate(WinOdds ~ Team, all_win, function(x) round(mean(x), 2)) colnames(result) <- c("Team", "AverageWinOdds") print(result)
方法二:Tidyverse工具链实现
如果习惯使用dplyr和tidyr,可以用更简洁的管道语法:
library(dplyr) library(tidyr) result <- df %>% # 将主客场球队转为长格式 pivot_longer( cols = c(HomeTeam, AwayTeam), names_to = "type", values_to = "Team" ) %>% # 匹配对应球队的获胜赔率 mutate(WinOdds = ifelse(type == "HomeTeam", HomeWin, AwayWin)) %>% # 分组计算平均赔率 group_by(Team) %>% summarise(AverageWinOdds = round(mean(WinOdds), 2)) %>% ungroup() print(result)
两种方法都会输出你需要的目标数据框:
Team AverageWinOdds 1 Barcelona 3.95 2 Madrid 5.07 3 Liverpool 2.11
内容的提问来源于stack exchange,提问作者Astral
相关产品推荐
相关产品推荐

